У меня есть графический интерфейс, созданный с использованием Pyqtgraph, который предназначен для простого обновления графика с данными, генерируемыми в отдельном скрипте Python. У меня есть рабочий поток (QThread), выполняющий многопроцессорный параллельный процесс, и я использую mp.Queue () для передачи данных из сценария sine_wave.py в рабочий поток. Оттуда данные отправляются в основное приложение.
Кажется, моя проблема в том, что код ожидает полного завершения sine_wave.py, прежде чем отправлять что-либо в основное приложение.
В предыдущей версии этого кода синусоидальные значения обновлялись внутри рабочего потока и просто передавались в основное приложение с помощью метода emit (). Это сработало отлично, и код для этого показан ниже.
from pyqtgraph import QtGui,QtCore
import sys
import ui_main
import numpy as np
import matplotlib.pylab
import time
import pyqtgraph
class ExampleApp(QtGui.QMainWindow, ui_main.Ui_MainWindow):
def __init__(self, parent=None):
pyqtgraph.setConfigOption('background', 'w') #before loading widget
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.btnAdd.clicked.connect(self.update)
self.grPlot.plotItem.showGrid(True, True, 0.7)
# these will init the thread and allow it to send messages
self.update()
def update(self):
# connecting thread functions
self.updater = MyThread()
self.updater.new_data.connect(self.data_update)
self.updater.start()
def data_update(self, t1, X, Y):
C=pyqtgraph.hsvColor(time.time()/5%1,alpha=.5)
pen=pyqtgraph.mkPen(color=C,width=10)
self.grPlot.plot(X,Y,pen=pen,clear=True)
print("update took %.02f ms"%((time.clock()-t1)*1000))
class MyThread(QtCore.QThread):
new_data = QtCore.pyqtSignal(object,object,object)
def __init__(self, parent = None):
QtCore.QThread.__init__(self, parent)
self.exiting = False
def __del__(self):
self.exiting = True
self.wait()
def run(self):
while not self.exiting :
t1=time.clock()
points=100 #number of data points
X=np.arange(points)
Y=np.sin(np.arange(points)/points*3*np.pi+time.time())
self.new_data.emit(t1,X,Y)
time.sleep(1.0) # dunno if I need this or not
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
form = ExampleApp()
form.show()
app.exec_()
print("DONE")
Однако мне нужно, чтобы генерация данных была независимым процессом, который просто сообщает о своих результатах каждый раз, когда происходит обновление.
Вот ссылка на git-репозиторий с версией, с которой я не могу работать ...
https://github.com/vlb9398/mce_gui_working_example.git
Чтобы активировать, просто запустите trimmed_gui.py