2013-07-30 169 views
2

我想要获取数据的活动情节,因为它是由使用pyqtgraph的仪器收集的。实现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_() 

回答

6

你还没有解释什么不是张贴的例子工作。有错误消息吗?该过程是否无法接收消息?情节结果与你期望的有些不同吗?

作为最初的答案,我会推荐一种不同的方法:使用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') 

注意,所有我们在这里创建的对象的 - 个篮板,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。

+0

谢谢,你的例子适用于我,我可以在我的过程中实现它,它也似乎更优雅。不过,我想知道哪些我可以像例如'pg.GraphicsWindow'在pyqtgraph的例子中,如果我想添加一个标题或更多的阴谋 – EOF

+0

我在执行多个QtProcess的过程时遇到了一些问题。我把从proc = mp.QtProcess()..到..数据= proc.transfer([])放到一个循环,以便我有每个这些对象的列表。这大多数工程,但有时它摊位,我不能ctrl-c出。是否有更稳定的方式来处理产生多个QtProcess-es?谢谢 – EOF

+0

听起来像一个错误。作为一种解决方法,为什么不在一个过程中创建多个图?无论如何,这似乎是一个更好的方法。 – Luke