PyQt5集成matplotlib绘图点击菜单栏后图表无法显示问题求解
PyQt5嵌入Matplotlib点击菜单无响应的修复方案
核心问题点
- 主入口实例类错误:你在程序入口处实例化的是Qt Designer生成的原始
Ui_MainWindow类,自己封装了绘图逻辑的Sheet子类完全没有被调用,所有扩展的绘图、信号绑定逻辑都未生效。 - 方法名大小写拼写错误:
setupUi方法中调用的是self.ToolBar(),但实际定义的方法名是Toolbar(第二个字母小写),Python对大小写敏感,导致菜单点击信号和绘图槽函数的绑定逻辑从未执行。 - 画布刷新方法未调用:自定义画布类
myCanvas的plot方法最后一行写的是self.draw,缺少括号没有实际执行方法,绘制完数据后没有触发画布刷新,自然不会显示图表。
修复后的完整可运行代码
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QVBoxLayout, QApplication, QMainWindow from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(789, 640) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setMinimumSize(QtCore.QSize(789, 599)) self.centralwidget.setMaximumSize(QtCore.QSize(789, 599)) self.centralwidget.setObjectName("centralwidget") self.widget = QtWidgets.QWidget(self.centralwidget) self.widget.setGeometry(QtCore.QRect(10, 10, 761, 531)) self.widget.setObjectName("widget") self.gridLayoutWidget = QtWidgets.QWidget(self.widget) self.gridLayoutWidget.setGeometry(QtCore.QRect(-1, -1, 761, 531)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.frame = QtWidgets.QFrame(self.gridLayoutWidget) self.frame.setStyleSheet("background-color: rgb(255, 255, 255);") self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.gridLayout.addWidget(self.frame, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 789, 21)) self.menubar.setObjectName("menubar") self.menuShow_Plot = QtWidgets.QMenu(self.menubar) self.menuShow_Plot.setObjectName("menuShow_Plot") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionShow_Plot = QtWidgets.QAction(MainWindow) self.actionShow_Plot.setObjectName("actionShow_Plot") self.menuShow_Plot.addAction(self.actionShow_Plot) self.menubar.addAction(self.menuShow_Plot.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.menuShow_Plot.setTitle(_translate("MainWindow", "Menu")) self.actionShow_Plot.setText(_translate("MainWindow", "Show Plot")) class Sheet(Ui_MainWindow): def __init__(self): super().__init__() def setupUi(self, MainWindow): super().setupUi(MainWindow) self.sc = myCanvas() self.l=QVBoxLayout(self.frame) self.l.addWidget(self.sc) self.Toolbar() def Toolbar(self): self.actionShow_Plot.triggered.connect(self.Plot) def Plot(self): x=[1,2,3,4,5,6,7,8,9,10] y=[2,4,6,8,10,12,14,16,18,20] self.sc.plot(x,y) class myCanvas(FigureCanvas): def __init__(self): self.fig = Figure() FigureCanvas.__init__(self,self.fig) def plot(self,x,y): self.fig.clear() self.ax = self.fig.add_subplot(111) self.ax.plot(x,y) self.draw() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Sheet() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者E. Artemis
相关产品推荐
相关产品推荐

