Я планирую сделать визуализацию данных, которые передаются в режиме реального времени. Данные на самом деле являются изображениями (потоком записей), но, скажем, бесконечно долго. Я хочу, чтобы это было показано в виде пятерки - движущееся окно. Визуализация должна быть выполнена в отдельном процессе.
Я думал о механизме синхронизации - от производителя к потребителю, и есть несколько возможных способов - fifo, кольцевой буфер, список списков вместе с механизмами блокировки и, наконец, QtProcess-> передача (используется там https://stackoverflow.com/a/17953175/10169642). У меня есть определился с последним, поскольку он хорошо синхронизирован с pyqtgraph, а сложность ниже.
Следующая ссылка содержит код, который выполняет постоянное обновление изображения.
http://www.pyqtgraph.org/downloads/0.10.0/pyqtgraph-0.10.0-deb/pyqtgraph-0.10.0/examples/ImageItem.py
Следующий фрагмент кода должен симулировать 3 шага обновления изображения (три последовательных кадра). Это также не отрезает хвост - это будет постоянно увеличиваться. Это эффект объединения двух фрагментов, приведенных в ссылках выше.
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import numpy as np
pg.mkQApp()
# Create remote process with a plot window
import pyqtgraph.multiprocess as mp
proc = mp.QtProcess()
rpg = proc._import('pyqtgraph')
win = rpg.GraphicsLayoutWidget()
win.show() ## show widget alone in its own window
win.setWindowTitle('pyqtgraph example: ImageItem')
view = win.addViewBox()
## lock the aspect ratio so pixels are always square
view.setAspectLocked(True)
## Create image item
img = rpg.ImageItem(border='w')
view.addItem(img)
## Set initial view bounds
view.setRange(QtCore.QRectF(0, 0, 10, 10))
## Create set of random images
dataInit = np.random.normal(size=(15, 10, 10), loc=1024, scale=64).astype(np.uint16)
# create an empty list in the remote process
data = proc.transfer([])
## We use the special argument _callSync='off' because we do
## not want to wait for a return value.
data.extend(dataInit[0], _callSync='off')
img.setImage(data)
data.extend(dataInit[1], _callSync='off')
img.setImage(data)
data.extend(dataInit[2], _callSync='off')
img.setImage(data)
Результат:
Файл> ".... / streaming_plot_4_multiprocess.py", строка 35, в
img.setImage (данные)
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 918, в вызов
вернуть self._handler.callObj (obj = self, args = args, kwds = kwds, ** opts)
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 567, в callObj
return self.send (request = 'callObj', opts = dict (obj = obj, args = args,> kwds = kwds), byteData = byteMsgs, ** opts)
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 470, в отправке
return req.result ()
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 636, в результате
пока не self.hasResult ():
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 654, в hasResult
self.result (блок = False)
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 647, в результате
self._result = self.proc.getResult (self.reqId) ## вызывает NoResultError, если> результат еще не доступен
Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-> packages \ pyqtgraph \ multiprocess \ remoteproxy.py", строка 508, в getResult
повышение отл
AttributeError: у объекта 'list' нет атрибута 'view'