You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:48:01