weixin_42191645 2020-05-04 19:16 采纳率: 0%
浏览 1195

pyqt5的gui界面显示matplotlib绘制图形更新问题?

最近在学习pyqt5显示图形时遇到了图新跟新问题,在网上搜了很多方法都没有解决点击按钮后绘制的图形更新的问题,网上看到用sip. delete先删除了控件,但是再一次添加控件绘制图形的时候,更新的图片显示不出来。我用savefig存储图片发现跟新的图片是有的,但是在gui界面不显示。麻烦大佬帮我看看下面简单的一个样例代码哪里出了问题,怎么修改,谢谢!!
ui文件(untitled.py)的代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1263, 473)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(0, 0, 1251, 421))
        self.groupBox.setObjectName("groupBox")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(0, 430, 1241, 41))
        self.pushButton.setObjectName("pushButton")
        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.plot_f)
        QtCore.QMetaObject.connectSlotsByName(Form)
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.groupBox.setTitle(_translate("Form", "GroupBox"))
        self.pushButton.setText(_translate("Form", "PushButton"))

新建一个python文件,由于我需要在另一个文件中调用到按钮点击事件,所以我用信号来连接按钮。

from PyQt5.Qt import *
from resorce.untitled import Ui_Form
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
from PyQt5 import sip

class MyFigure(FigureCanvas):
    def __init__(self,width=5, height=4, dpi=100):
        #第一步:创建一个创建Figure
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        #第二步:在父类中激活Figure窗口
        super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
        #第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)
        self.axes = self.fig.add_subplot(111)
    #第四步:就是画图,【可以在此类中画,也可以在其它类中画】
    def plotsin(self):
        self.axes0 = self.fig.add_subplot(111)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes0.plot(t, s)
    def plotcos(self):
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)

class StockPane_one(QWidget, Ui_Form):
    plot_signal = pyqtSignal()
    def __init__(self, parent=None, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.setupUi(self)
        # self.F = MyFigure(width=3, height=2, dpi=100)
        # # self.F.plotsin()
        # self.plotcos()
        # # 第六步:在GUI的groupBox中创建一个布局,用于添加MyFigure类的实例(即图形)后其他部件。
        # self.gridlayout = QGridLayout(self.groupBox)  # 继承容器groupBox
        # self.gridlayout.addWidget(self.F, 0, 1)

    def plotcos(self):
        t = np.arange(0.0, 5.0, 0.01)
        s = np.cos(2 * np.pi * t)
        self.F.axes.plot(t, s)
        self.F.fig.suptitle("cos")

    def plot_f(self):
        self.plot_signal.emit()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = StockPane_one()
    i=0
    tt=0
    def plotcos():
        global i
        global tt
        if tt != 0:
            window.gridlayout.removeWidget(window.F)
            sip.delete(window.F)
        tt=1
        window.F = MyFigure(width=3, height=2, dpi=100)
        # 第六步:在GUI的groupBox中创建一个布局,用于添加MyFigure类的实例(即图形)后其他部件。
        t = np.arange(i, i+5, 0.01)
        if i==0:
            s = np.cos(2 * np.pi * t)
        elif i==1:
            s = np.sin(2 * np.pi * t)
        else:
            s=i*t+1
        print("i=",i)
        i=i+1
        window.F.axes.plot(t, s)
        window.F.fig.suptitle("cos")
        window.F.fig.savefig('./test'+str(i))
        window.gridlayout = QGridLayout(window.groupBox)  # 继承容器groupBox
        window.gridlayout.addWidget(window.F, 0, 1)


    window.plot_signal.connect(plotcos)
    window.show()
    sys.exit(app.exec_())

如何让i=1及以后的图新显示在GUI界面上,麻烦有会的大佬帮我看一看,谢谢。

  • 写回答

1条回答 默认 最新

  • MFine 2020-05-06 11:40
    关注

    window.F.setVisible(True)
    plotcos()函数末尾里加上这行代码,就可以看到新的图片。
    代码写得太啰嗦,很多没有用的。要想显示在GUI里,可能要大改下。

    评论

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集