【发布时间】:2023-03-29 22:35:01
【问题描述】:
目标:
我想在 pyQt4 GUI 窗口中嵌入 Matplotlib 图。剧情要及时更新。
问题:
窗口冻结,直到绘图完成。我希望情节实时更新。
上下文:
我们有数值算法正在处理一些数据,我希望该图显示数据集如何受到算法的影响。该算法每 0.5 秒完成一次迭代 - 每次迭代都必须更新绘图。
测试代码:
算法替换为test(),它绘制一个随机点 100 次。下面的代码说明了问题:
import sys
from PlotGUI import *
import threading
from random import randint
import time
class GUIForm(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self,parent)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.startSim)
self.cPlot = None # custom plotter
self.instantiatePlot()
def instantiatePlot(self):
self.cPlot = CustomPlotter(self.ui.widget.canvas)
self.cPlot.prepareFigure()
def startSim(self):
self.cPlot.clear();
draw_thread = threading.Thread(target=self.cPlot.test())
draw_thread.start()
class CustomPlotter():
def __init__(self, canvas):
print 'constructor'
self.canvas = canvas
def prepareFigure(self):
ax = self.canvas.ax
ax.set_ylim([-1,101])
#ax.set_xlim([dt[0],dt[1]])
ax.set_ylim([-1, 10])
self.canvas.draw()
def clear(self):
self.canvas.ax.clear()
def test(self):
canvas = self.canvas
ax = canvas.ax
for x in range(0,100):
y = randint(0,9)
ax.plot(x, y, 'ro')
print x
canvas.draw()
time.sleep(1)
#canvas.show()
#canvas.update()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = GUIForm()
myapp.show()
sys.exit(app.exec_())
提前致谢。这是一些原型设计,所以我愿意接受所有提供快速解决方案的选项/替代方案。
【问题讨论】:
-
哪个库有 PlotGUI 模块?
-
QtGui、QtCore、Ui_Dialog()依赖于PlotGUI模块
-
这里的答案有点脱节,但基本上你没有正确创建线程,因此它为什么会阻塞。但是,正确创建它可能会因为辅助线程中的 Qt 调用而导致崩溃(这是不允许的)。此外,当实际重绘绘图时,GUI 将始终阻塞,没有办法,但您可以将绘图数据的准备/获取卸载到另一个线程。您只需将此数据发送到主线程以更新 GUI(可能使用
QThread和信号发射 - 有很多关于此的问题)
标签: python qt matplotlib pyqt pyqt4