【发布时间】:2019-09-24 08:10:53
【问题描述】:
我不是经验丰富的程序员,我正在尝试使用 Qt for python (PySide2) 在 python 中创建一种数据记录器程序来构建 GUI。我能够使用 Designer 创建一个 gui 并将其加载到 python 中。 gui 现在只是一个空白窗口。然后我创建了一个在显示图形的窗口中启动 MatplotLib 的函数,并使用 Qt 计时器更新主程序的每个循环中的数据。
一切正常,但 MatPlotLib 的重绘时间太慢了 gui 刷新。所以我尝试将 MatPlotLib 放在一个单独的线程中,经过大量试验后我明白它不能在单独的线程中运行.. 最后我决定尝试使用多处理。现在 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_())
【问题讨论】:
标签: python matplotlib multiprocessing pyside2