2017-02-14 33 views
0

我曾尝试下面的代码,在一个脚本文件的工作原理图,我可以看到一个图表被实时更新,pyqtgraph实时更新不显示

from PyQt4 import QtGui, QtCore 
import numpy as np 
import pyqtgraph as pg 
from pyqtgraph.ptime import time 

app = QtGui.QApplication([]) 

pw = pg.plot() 
timer = pg.QtCore.QTimer() 


def update(): 
    x = np.random.normal(size=(100)) 
    y = np.random.normal(size=(100)) 
    pw.plot(x, y, clear=True) 


timer.timeout.connect(update) 
timer.start(0) 

## Start Qt event loop unless running in interactive mode. 
if __name__ == '__main__': 
    import sys 

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

但如果我把更新实时部分成被称为在对话框内点击一个按钮的功能,图表显示什么,

class TestDialog(QtGui.QDialog): 
    def __init__(self, parent): 
     super(TestDialog, self).__init__(parent, flags=QtCore.Qt.WindowMinimizeButtonHint|QtCore.Qt.WindowMaximizeButtonHint) 

    self.resize(1000,618) 

    self.chart_button = QtGui.QPushButton('Show chart', self) 
    self.chart_button.clicked.connect(self.show_chart) 
    vbox = QtGui.QVBoxLayout() 
    vbox.addwidget(self.chart_button) 
    self.setLayout(vbox) 

    def show_chart(self): 
     pw = pg.plot() 
     timer = pg.QtCore.QTimer() 

     def update(): 
      x = np.random.normal(size=(100)) 
      y = np.random.normal(size=(100)) 
      pw.plot(x, y, clear=True) 

     timer.timeout.connect(update) 
     timer.start(0) 
     if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
      QtGui.QApplication.instance().exec_() 

如果我update函数内设置断点,我发现它不被称为第二个脚本,我可以知道为什么?

+0

也许你可以给手回到主窗口? show_cart函数在此处不控制更新过程。 self.parent = parent #under super(测试...... self.parent.processEvents()#在更新函数末尾 update应该是self.update? – ymmx

回答

1

您只需将父项传递给定时器即可。变化

timer = pg.QtCore.QTimer() 

timer = pg.QtCore.QTimer(self) 
-1

下面的代码为我工作:

# -*- coding: utf-8 -*- 
from PyQt4 import QtGui, QtCore 
import numpy as np 
import pyqtgraph as pg 
import sys 
from pyqtgraph.ptime import time 



class TestDialog(QtGui.QMainWindow): 
    def __init__(self, parent): 
     super(TestDialog, self).__init__() 
     self.parent=parent 
     self.centralWidget = QtGui.QWidget() 
     self.setCentralWidget(self.centralWidget) 
     self.resize(1000,618) 
     self.vbox = QtGui.QVBoxLayout() 

     self.chart_button = QtGui.QPushButton('Show chart', self) 
     self.pw = pg.PlotWidget() 
     self.vbox.addWidget(self.chart_button) 
     self.vbox.addWidget(self.pw) 
     self.centralWidget.setLayout(self.vbox) 
     x = np.random.normal(size=(100)) 
     y = np.random.normal(size=(100)) 
     self.pw.plot(x, y,clear=True) 
     self.chart_button.clicked.connect(self.show_chart) 


    def update(self): 
     x = np.random.normal(size=(100)) 
     y = np.random.normal(size=(100)) 
     self.pw.plot(x, y, clear=True) 
     QtCore.QCoreApplication.processEvents() 


    def show_chart(self): 
     self.timer = pg.QtCore.QTimer() 
     self.timer.setSingleShot(False) 
     self.timer.timeout.connect(self.update) 
     self.timer.start(100) 




## Start Qt event loop unless running in interactive mode. 
def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = TestDialog(app) 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

你也可以保持show_chart函数内部的更新,如果你想要的。

def show_chart(self): 
    def update(): 
     x = np.random.normal(size=(100)) 
     y = np.random.normal(size=(100)) 
     self.pw.plot(x, y, clear=True) 
     QtCore.QCoreApplication.processEvents() 
    self.update = update 
    self.timer = pg.QtCore.QTimer() 
    self.timer.setSingleShot(False) 
    self.timer.timeout.connect(self.update) 
    self.timer.start(100)