2013-07-30 6 views
2

pyqtgraph를 사용하여 계측기에서 수집되는 데이터의 실시간 플롯을 얻으려고합니다.실시간 데이터 그래프를위한 pyqtgraph 구현

데이터 수집은 주 프로세스에 의해 처리됩니다. 주 프로세스에서 데이터 수집은 연결을 통해 그 프로세스를 처리하는 하위 프로세스로 전달됩니다. 난 그냥 새 데이터를 전달하려고하고 새로운 데이터가 전달되면 업데이 트해야합니다.

Qt Timer 업데이트 루프 내부에서 연결을 읽음으로써이를 구현하려고 시도했지만 연속적인 업데이트주기 사이에 그래프 데이터 (내가 추가하려는)를 전달하는 데 어려움이 있습니다. 나는 아래 코드에서 생략했지만, 근본적으로 connData를 연속적으로 많이 사용하고 싶습니다. 글로벌을 사용하는 것이 효과적 일 것이라고 생각했지만, 어떤 이유로 여기에서 구현할 수 없습니다.

편집 1 :

나가서 설명하자면 NameError를 : 나는 pyqtgraph 예와 비교 한 문제는 Qtimer의 업데이트 프로세스에 데이터를 전달하는 것, 내가 얻을 전역 이름은 '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') 

주 - RPG, plotwin, 곡선, 데이터가 - 프록시 실제 개체에 대한 있습니다 원격 프로세스에서. 따라서 보통 pyqtgraph 클래스로 수행 할 수있는 거의 모든 작업을 이러한 객체로 수행 할 수 있으며 결과는 원격 프로세스에 나타납니다. 예를 들면 : - 로컬 pyqtgraph 모듈 PG, 원격 모듈 RPG

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

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

두 예는 유일한 차이는 출발점이다.

+0

감사합니다. 귀하의 예제가 저에게 효과적이며이 프로세스를 더 우아하게 보이도록 구현할 수 있습니다. 그러나 나는 이들 중 어느 것이 내가 예를 들어, 같은 방법으로 부를 수 있는지 알고 싶다. 'pg.GraphicsWindow'를 pyqtgraph 예제에 추가했습니다. – EOF

+0

여러 QtProcess 프로세스를 구현하는 데 문제가 있습니다. proc = mp.QtProcess() ..to .. data = proc.transfer ([])를 루프에 넣어서 각 객체의 목록을 갖도록했습니다. 이것은 주로 작동하지만 가끔은 실속하고 나는 ctrl - C를 할 수 없습니다. 여러 QtProcess-es를 생성하는 데 더 안정적인 방법이 있습니까? 감사합니다 – EOF

+0

버그와 같은 소리입니다.이 문제를 해결하기 위해 단일 프로세스에서 여러 개의 플롯을 작성하는 것이 가장 좋은 이유는 무엇입니까? 어쨌든 더 나은 접근 방법 인 것 같습니다. – Luke