2013-07-30 82 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