2017-01-16 52 views
3

我在Python中很新穎,試圖製作一個PyQt4應用程序,我在其中嵌入了PyQtGraph。我有這個PyQtGraph現場繪圖儀的作品充滿了想象:在PyQt4中使用PyQtGraph進行實時繪圖

from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 
import random 

app = QtGui.QApplication([]) 
p = pg.plot() 
curve = p.plot() 
data = [0] 

def updater(): 

    data.append(random.random()) 
    curve.setData(data) #xdata is not necessary 


timer = QtCore.QTimer() 
timer.timeout.connect(updater) 
timer.start(0) 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

對於在一個更大的應用程序PyQt4的嵌入,我需要一個佈局包括pyqtgraph.PlotWidget()。對於這個問題,我在我的MainWindow中設置了一個centralWidget。我創建了一個按鈕,即應開始策劃,就像前面的代碼做,但是當我調用更新功能,通過該功能,繪圖儀只是什麼也沒有發生:

import sys 
from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 
import random 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     login_widget = LoginWidget(self)#to say where the button is 
     login_widget.button.clicked.connect(self.plotter) 
     self.central_widget.addWidget(login_widget) 

    def plotter(self): 
     self.data =[0] 
     timer = QtCore.QTimer() 
     timer.timeout.connect(self.updater) 
     timer.start(0) 

    def updater(self): 

     self.data.append(random.random()) 
     plot.setData(self.data) 

class LoginWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     global plot 
     super(LoginWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.button = QtGui.QPushButton('Start Plotting') 
     layout.addWidget(self.button) 
     plot = pg.PlotWidget() 
     layout.addWidget(plot) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.show() 
    app.exec_() 

沒有任何反應,因爲我有線程?

回答

2

參考有幾件事情在代碼中考慮。
首先,跟@ luddek的回答一樣,你需要跟蹤你的變量。如果您在類方法中定義了一個變量,並且此類方法完成執行,則該變量將丟失。也從外面看不見。
因此,使用類變量是一個好主意,
self.plot而不是plot
self.timertimer
self.login_widget而不是login_widget
(也相反,我不會電子書籍在PyQt的PROGRAMM使用global,雖然它是有效代碼)

接下來,PlotWidget沒有setData方法。繪製數據到PlotItem的情節有一點涉及:
pg.PlotWidget()有一個PlotItem,你可以通過.getPlotItem()獲得。然後你需要調用plot(),它返回你想要添加數據的實際曲線。在下面的示例中,我介紹了新變量self.curve,您可以通過該變量添加數據self.curve.setData(self.data)

這是完整的工作代碼。

from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 
import random 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     self.login_widget = LoginWidget(self) 
     self.login_widget.button.clicked.connect(self.plotter) 
     self.central_widget.addWidget(self.login_widget) 

    def plotter(self): 
     self.data =[0] 
     self.curve = self.login_widget.plot.getPlotItem().plot() 

     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.updater) 
     self.timer.start(0) 

    def updater(self): 

     self.data.append(self.data[-1]+0.2*(0.5-random.random())) 
     self.curve.setData(self.data) 

class LoginWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(LoginWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.button = QtGui.QPushButton('Start Plotting') 
     layout.addWidget(self.button) 
     self.plot = pg.PlotWidget() 
     layout.addWidget(self.plot) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.show() 
    app.exec_() 
+0

非常感謝@ImportanceOfBeingErnest,我真的想讓我的變量範圍理解起來並運行,但這需要我一些時間。幸運我你們是充滿激情的程序員:-)另外,我沒有在文檔中找到正確使用pg.PlotWidget().....再次感謝! – Ivy

+1

如果這解決了您的問題,請考慮[接受它](http://meta.stackexchange.com/a/5235)。如果不能隨意改善你的問題。 – ImportanceOfBeingErnest

2

updater()不被調用,因爲計時器被垃圾收集器刪除。

您需要在定時器的某處保留一個引用。例如,您可以創建__init__

def __init__(self, parent=None): 
    ... 
    self.timer = QtCore.QTimer() 
+1

雖然這是正確的,但防止計時器被垃圾收集只是整個問題的一部分。 – ImportanceOfBeingErnest

相關問題