die Umsetzung pyqtgraph für live-Daten Grafik
Ich versuche zu bekommen eine live-plot der Daten, wie Sie gesammelt wird durch ein instrument mit pyqtgraph.
Erhebung der Daten erfolgt durch den Haupt-Prozess-dieser wird dann übergeben Sie die Verbindung zu einem Teilprozess, dass Parzellen. Ich versuche nur, um pass die neuen Daten und es update, wenn die neuen Daten übergeben.
Habe ich versucht zu implementieren, indem Sie die Verbindung, Lesen Sie im inneren des Qt-Timer-update-Schleife, aber dann habe ich Schwierigkeiten beim graph-Daten (die möchte ich anfügen) zwischen aufeinander folgenden update-Zyklen. Ich weggelassen aus die folgenden code, aber grundsätzlich möchte ich an aufeinanderfolgenden viele connData, dachte ich mit einem global funktionieren würde, aber aus irgendeinem Grund kann ich nicht umsetzen, dass hier.
EDIT 1: Das problem, dass ich im Vergleich mit der pyqtgraph Beispiele scheint die übergabe von Daten an den update-Prozess der Qtimer, bekomme ich:
NameError: global name 'CurveData' ist nicht definiert
Dem Grund habe ich versucht, es zu tun auf diese Weise, anstatt mit dem multiprocessing-Modul pyqtgraph ist, dass ich nicht wollen, übergeben Sie die gesamten Daten über die Verbindung jedes mal (ich dachte, das wäre nötig). Danke!
EDIT 2: gibt es Dokumentation für pyqtgraph.Multiprozess irgendwo?
(dies ist der ursprüngliche code)
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_()
modifizierte version:
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_()
InformationsquelleAutor EOF | 2013-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie nicht erklärt, was nicht funktioniert, über das Beispiel gepostet. Gibt es Fehlermeldungen? Funktioniert der Prozess fehlschlagen, um Nachrichten zu empfangen? Sind die plot-Ergebnisse irgendwie anders ab, was erwarten Sie?
Als eine erste Antwort, ich empfehle einen anderen Ansatz: verwenden Sie pyqtgraph built-in multiprocessing-Funktionen. Wenn Sie führen Sie diesen code aus der main-Prozess, wird es geben Sie einen proxy zu einem plot-Fenster und die Kurve läuft in einem neuen Prozess. Methoden, die Sie aufrufen, auf die proxies werden an den remote-Prozess:
Beachten Sie, dass alle Gegenstände, die wir hier geschaffen--rpg, plotwin, Kurve und Daten--sind proxies für die realen Objekte in der remote-Prozess. Also fast alles, was Sie tun können, mit den üblichen pyqtgraph Klassen können auch durchgeführt werden, die mit diesen Objekten und die Ergebnisse werden angezeigt, in der remote-Prozess. Zum Beispiel:
Der einzige Unterschied der beiden Beispiele ist der Ausgangspunkt--pg für die lokale pyqtgraph-Modul und Rollenspiel für die remote-Modul.
Ich habe einige problem mit der Umsetzung Ihrer Prozess für mehrere QtProcess. Ich put put von proc = mp.QtProcess() ..um.. data = proc.transfer([]) in eine Schleife, so dass ich eine Liste habe von jedem dieser Objekte. Dies funktioniert auch meistens, aber manchmal ist es Stände, und ich kann nicht Strg-c aus. Gibt es eine stabilere Art und Weise zu handhaben laichen mehrere QtProcess-es? Dank
Klingt wie ein bug. Als workaround kann, warum nicht erstellen Sie einfach mehrere Diagramme in einem einzigen Prozess? Das scheint der bessere Ansatz ist, sowieso.
Ich bin versucht, um dieses Beispiel auszuführen, aber ich bekomme
socket.error: [Errno 48] Address already in use
. Offenbar die Linie istproc = mq.QTProcess()
. @Luke Irgendwelche Vorschläge?Es ist ein den letzten commit in das entwickeln-branch auf github, der möglicherweise bereits behoben. Versuchen Sie, und wenn es immer noch gebrochen, dann post auf der mailing-Liste, oder öffnen Sie eine github-issue.
InformationsquelleAutor Luke