最近在学习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界面上,麻烦有会的大佬帮我看一看,谢谢。