Запуск независимого скрипта с многопроцессорной обработкой, который обновляет сюжет QtGui - PullRequest
0 голосов
/ 13 января 2019

У меня есть графический интерфейс, созданный с использованием 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

...