目標:動態繪圖與Matplotlib和PyQt的 - 凍結窗口
我想嵌入在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模塊? – dopstar
QtGui,QtCore,Ui_Dialog()取決於PlotGUI模塊 – AdrianFox
這裏的答案有些脫節,但基本上你沒有正確地創建線程,因此它阻止了它。但是,正確創建它可能會導致由於輔助線程中的Qt調用而導致崩潰(這是不允許的)。此外,當繪圖實際上正在重繪時,GUI總是會阻塞,但是您可以將繪圖數據的準備/獲取卸載到另一個線程中。你只需要將這些數據發送到主線程來更新GUI(可能使用'QThread'和信號發射 - 關於這個問題有很多問題) –