Embed a Matplotlib graphic into a widget - PyQt5

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I would like to embed a graphic from Matplotlib into an existing GUI containing a Widget and a PushButton developed from QtDesigner and PyQt5. I can embed the graphic but can't resize the graphic to take all space available/needed into the Widget.

Front end code:

from PyQt5 import QtCore, QtGui, QtWidgets  class Ui_MainWindow(object):     def setupUi(self, MainWindow):         MainWindow.setObjectName("MainWindow")         MainWindow.resize(595, 393)         self.centralwidget = QtWidgets.QWidget(MainWindow)         self.centralwidget.setObjectName("centralwidget")         self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)         self.gridLayout.setObjectName("gridLayout")         self.pushButton = QtWidgets.QPushButton(self.centralwidget)         self.pushButton.setMaximumSize(QtCore.QSize(100, 16777215))         self.pushButton.setObjectName("pushButton")         self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)         self.widget = QtWidgets.QWidget(self.centralwidget)         self.widget.setMinimumSize(QtCore.QSize(0, 200))         self.widget.setStyleSheet("background-color: rgb(255, 255, 255);")         self.widget.setObjectName("widget")         self.gridLayout.addWidget(self.widget, 0, 1, 1, 1)         MainWindow.setCentralWidget(self.centralwidget)         self.menubar = QtWidgets.QMenuBar(MainWindow)         self.menubar.setGeometry(QtCore.QRect(0, 0, 595, 21))         self.menubar.setObjectName("menubar")         MainWindow.setMenuBar(self.menubar)         self.statusbar = QtWidgets.QStatusBar(MainWindow)         self.statusbar.setObjectName("statusbar")         MainWindow.setStatusBar(self.statusbar)          self.retranslateUi(MainWindow)         QtCore.QMetaObject.connectSlotsByName(MainWindow)      def retranslateUi(self, MainWindow):         _translate = QtCore.QCoreApplication.translate         MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))         self.pushButton.setText(_translate("MainWindow", "PushButton"))   if __name__ == "__main__":     import sys     app = QtWidgets.QApplication(sys.argv)     MainWindow = QtWidgets.QMainWindow()     ui = Ui_MainWindow()     ui.setupUi(MainWindow)     MainWindow.show()     sys.exit(app.exec_()) 

Back end code:

import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QSizePolicy from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure from front_end import Ui_MainWindow  class Graph_init(FigureCanvas):      def __init__(self, parent=None):          fig = Figure()         self.axes = fig.add_subplot(111)         self.compute_initial_figure()          FigureCanvas.__init__(self, fig)         self.setParent(parent)          FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)         FigureCanvas.updateGeometry(self)   class Graph_populate(Graph_init):      def compute_initial_figure(self):          x = [2000,2001,2002,2003,2004]         y = [10,20,30,40,50]          self.axes.plot(x, y)   class GUI(QMainWindow, Ui_MainWindow):     def __init__(self, parent=None):         super(GUI, self).__init__(parent)         self.setupUi(self)         self.sc = Graph_populate(self.widget)   if __name__ == '__main__':     app = QApplication(sys.argv)     prog = GUI()     prog.showMaximized()     sys.exit(app.exec_()) 

Thank you

回答1:

In PyQt you would normally add a widget to your application by adding it to a Layout. In the code you seem to have forgotten to do that step.

So if self.gridLayout is the layout you want your FigureCanvas to reside in, you would need to add the latter to the former as

self.gridLayout.addWidget(self.sc, 0, 1, 1, 1) 

The role of self.widget on the other hand is not really clear here and you may probably remove it. The self.centralwidget can take the role of the parent, if it is really needed,

self.sc = Graph_populate(self.centralwidget) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!