python - 为实时数据绘图实现 pyqtgraph

标签 python qt qtgui pyqtgraph

我正在尝试获取实时数据图,因为它是由使用 pyqtgraph 的仪器收集的。

数据收集由主进程处理,然后通过连接传递到绘制它的子进程。我只是想传递新数据并在传递新数据时更新它。

我试图通过将读取的连接放入 Qt Timer 更新循环中来实现这一点,但是我很难在连续的更新周期之间传递图形数据(我想附加到它)。我从下面的代码中省略了,但基本上我想加入连续的大量 connData,我认为使用全局会起作用,但由于某种原因我不能在这里实现它。

编辑 1:我与 pyqtgraph 示例比较的问题似乎是将数据传递给 Qtimer 的更新过程,我得到:

NameError: 全局名称“CurveData”未定义

我尝试这样做而不是使用 pyqtgraph 的多处理模块的原因是我不想每次都通过连接传递整个数据集(我认为这是必要的)。谢谢!

编辑 2:某处是否有 pyqtgraph.multiprocess 的文档?

(这是提供的原始代码)

import multiprocessing
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import sys
import os

def MakeGraph(conn):

    win = pg.GraphicsWindow(title = "test")
    win.resize(300,300)

    p1 = win.addPlot(title = "test")

    curve = p1.plot(pen = 'y')
    timer = QtCore.QTimer()

    def Update():
        try:
            ConnData = conn.recv()
            ConnData = [float(i) for i in ConnData]
            curve.setData(ConnData)
        except EOFError:
            print "Graph connection closed\n"
            timer.stop()
            QtGui.QApplication.quit()

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

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

修改版本:

import multiprocessing
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import sys
import os

def MakeGraph(conn):

    win = pg.GraphicsWindow(title = "test")
    win.resize(300,300)

    p1 = win.addPlot(title = "test")

    curve = p1.plot(pen = 'y')
    timer = QtCore.QTimer()
    CurveData = []

    def Update():
        global CurveData
        try:
            ConnData = conn.recv()
            ConnData = [float(i) for i in ConnData]
            CurveData = np.append(CurveData,ConnData)
            curve.setData(CurveData)
        except EOFError:
            print "Graph connection closed\n"
            timer.stop()
            QtGui.QApplication.quit()

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

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

最佳答案

您没有解释发布的示例有什么不起作用。有错误信息吗?进程是否收不到消息?绘图结果是否与您的预期有所不同?

作为初始答案,我将推荐一种不同的方法:使用 pyqtgraph 的内置多处理功能。如果您从主进程运行此代码,它将为您提供在新进程中运行的绘图窗口和曲线的代理。您在代理上调用的任何方法都将转发到远程进程:

import pyqtgraph as pg
pg.mkQApp()

# Create remote process with a plot window
import pyqtgraph.multiprocess as mp
proc = mp.QtProcess()
rpg = proc._import('pyqtgraph')
plotwin = rpg.plot()
curve = plotwin.plot(pen='y')

# create an empty list in the remote process
data = proc.transfer([])

# Send new data to the remote process and plot it
# We use the special argument _callSync='off' because we do
# not want to wait for a return value.
data.extend([1,5,2,4,3], _callSync='off')
curve.setData(y=data, _callSync='off')

请注意,我们在此处创建的所有对象(rpg、plotwin、曲线和数据)都是远程进程中真实对象的代理。因此,几乎任何你可以用通常的 pyqtgraph 类做的事情也可以用这些对象来完成,结果将出现在远程进程中。例如:

# Local code:
win = pg.GraphicsWindow()
p1 = win.addPlot()
p2 = win.addPlot()

# Remote code:
win = rpg.GraphicsWindow()
p1 = win.addPlot()
p2 = win.addPlot()

这两个示例的唯一区别是起点——本地 pyqtgraph 模块的 pg 和远程模块的 rpg。

关于python - 为实时数据绘图实现 pyqtgraph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951155/

相关文章:

c++ - 如何从 C++ Qt 代码在 QML QtLocation map 上添加 PoI

c++ - QtOpengl的演变

Python print() 函数不重新计算 while 循环中的变量

c++ - 相对于另一个顶级对象定位

c++ - QComboBox 的鼠标按下槽 - 如果用户单击组合框,则动态填充项目

c++ - 使 QTableWidget 可以像使用 MS 访问一样逐行编辑

c++ - Qt:在表单上添加文件选择字段(QLineEdit 和 "browse"按钮)

python - Python 的 super() 如何与多重继承一起工作?

python - pywikipedia 名称 wikiquote 未定义?

python - scapy 操作系统错误 : [Errno 9] Bad file descriptor