【问题标题】:Realtime plot with pyqtgraph使用 pyqtgraph 实时绘图
【发布时间】:2018-03-05 03:02:07
【问题描述】:

我在使用 pyqtgraph 进行实时绘图时遇到问题。我希望图表每从串行输入收集的 100 个项目更新一次,但在收集数据完成后曲线只显示一次。每 100 个项目后,调试 print "boo" 会打印到控制台,但 updatePlot() 似乎仅在结束循环时才被调用。这是我的代码:

class EKG(QtGui.QMainWindow, out.Ui_MainWindow):

    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)
        self.collectedData = []
        self.dataPlot.showGrid(x=True, y=True, alpha=0.6)
        self.plt = self.dataPlot.plot(pen='m', antialias=True)
        self.port = "COM9"
        self.actionZako_cz.triggered.connect(self.close_window)
        self.startBtn.clicked.connect(self.collectData)

    def getTime(self):
        return int(self.timeBox.toPlainText())

    def updatePlot(self):
        self.plt.setData(self.collectedData)

    def collectData(self, howLong):
        howLong = self.getTime()
        self.collectedData = []
        serialData = serial.Serial(self.port, 57600)
        t_end = time.time() + howLong
        while time.time() < t_end:
            try:
                self.collectedData.append(int(serialData.readline().strip()))
            except ValueError:
                pass
            if len(self.collectedData) % 100 == 0:
                print "boo"
                self.updatePlot()
        serialData.close()

如有任何建议,我将不胜感激;这是我第一次使用 pyqtgraph,但我还没有掌握它的窍门......

【问题讨论】:

    标签: python-2.7 plot pyqtgraph


    【解决方案1】:

    我已经找到了解决方案,以防有人偶然发现类似的问题:

    def updatePlot(self):
        self.plt.setData(self.collectedData)
        QtGui.QApplication.processEvents()
    

    添加对处理事件的调用会导致绘图正确更新!

    【讨论】:

    • 我通常更喜欢避免processEvents() 以避免重新进入事件循环。相反,对串行部分使用异步机制(Qt 串行支持或带有 Qt 循环集成的 Python、twisted/trio/asyncio 或至少一个 QTimer),然后在调用 update 之后,您自然会将控制权交还给循环。
    猜你喜欢
    • 2019-02-02
    • 2017-12-16
    • 2019-04-01
    • 2019-07-24
    • 2017-05-31
    • 2013-07-30
    • 2019-02-13
    • 2021-12-27
    • 2017-06-02
    相关资源
    最近更新 更多