我正在尝试获取数据的实时图,因为它是由使用pyqtgraph的仪器收集的。
数据收集由主进程处理,然后通过连接传递到绘制数据的子进程。我只是尝试传递新数据,并在传递新数据时对其进行更新。
我试图通过将读取的连接放在Qt计时器更新循环中来实现这一点,但是在连续的更新周期之间传递图形数据(我想要附加的数据)会有困难。我在下面的代码中省略了,但基本上我想连接连续的许多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_()发布于 2013-07-31 01:07:49
您还没有解释所发布的示例的不起作用的地方。是否有错误消息?流程是否无法接收消息?绘图结果是否与您预期的有所不同?
作为初步答案,我将推荐一种不同的方法:使用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、curve和data--都是远程进程中真实对象的代理。因此,您可以使用常见的pyqtgraph类执行的几乎任何操作都可以使用这些对象来完成,并且结果将显示在远程进程中。例如:
# Local code:
win = pg.GraphicsWindow()
p1 = win.addPlot()
p2 = win.addPlot()
# Remote code:
win = rpg.GraphicsWindow()
p1 = win.addPlot()
p2 = win.addPlot()这两个示例的唯一区别是起点--pg用于本地pyqtgraph模块,而rpg用于远程模块。
https://stackoverflow.com/questions/17951155
复制相似问题