Я не опытный программист, и я пытаюсь создать своего рода программу регистрации данных на python, используя Qt для python (PySide2) для построения GUI.Я смог создать графический интерфейс с помощью Designer и загрузить его в Python.Графический интерфейс пока только пустое окно.Затем я создал функцию, которая запускает MatplotLib в окне с графиком, и я обновляю данные в каждом цикле основной программы, используя таймер Qt.
Everithing работает, но время перерисовки MatPlotLib слишком сильно замедляет обновление графического интерфейса.Поэтому я попытался поместить MatPlotLib в отдельный поток, и после многих испытаний я понял, что он не может работать в отдельном потоке. В конце я решил попробовать Multiprocessing.Теперь MatPlotLib работает нормально в отдельном процессе (я использую очередь для отправки данных в MatPlotLib) и корректно завершаю работу после завершения процесса, но когда я закрываю главное окно, программа закрывается полностью, а также нажимая Ctrl + C, появляется приглашениезаблокирован.
Это мой код:
#!/usr/bin/env python3
import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import QFile, QTimer
import matplotlib.pyplot as plt
from multiprocessing import Process, Queue, freeze_support
import random
class DSL(QWidget):
def __init__(self):
# LOAD HMI
QWidget.__init__(self)
designer_file = QFile('userInterface.ui')
designer_file.open(QFile.ReadOnly)
loader = QUiLoader()
self.ui = loader.load(designer_file, self)
designer_file.close()
self.ui.show()
# Data to be visualized
self.data = []
def mainLoop(self):
self.data = []
for i in range(10):
self.data.append(random.randint(0, 10))
# Send data to graph process
queue.put(self.data)
# LOOP repeater
QTimer.singleShot(10, self.mainLoop)
def graphProcess(queue):
for i in range(10):
# Get data
data = queue.get()
# MatPlotLib
plt.ion()
plt.clf()
plt.plot(data)
plt.show()
plt.pause(0.1)
print('process end')
if __name__ == '__main__':
# MatPlotLib Process
queue = Queue()
freeze_support()
p = Process(target=graphProcess, args=(queue,))
p.daemon = True
p.start()
# PySide2 Process
app = QApplication(sys.argv)
dsl = DSL()
dsl.mainLoop()
sys.exit(app.exec_())