pyqtgraph实时更新图表没有显示

时间:2017-02-14 09:31:44

标签: python pyqt pyqt4 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函数中设置断点,我发现它没有在第二个脚本中调用,我可以知道为什么吗?

2 个答案:

答案 0 :(得分:2)

您只需将父级传递给计时器即可。改变

timer = pg.QtCore.QTimer()

timer = pg.QtCore.QTimer(self)

答案 1 :(得分:-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)