如何在一个过程中多次启动pyqt GUI?

时间:2018-12-03 21:40:32

标签: python pyqt pyqt5 pyqtgraph

我如何构建代码以在一个过程中连续多次运行pyqt GUI?

(如果有关系,请特别注明pyqtgraph)

上下文

一个Python脚本,用于在测量设备上执行长时间运行的数据捕获(for循环很大)。在每次捕获迭代过程中,都会运行一个新的GUI,并在运行主要捕获代码时将实时数据从测量设备显示给用户。

我想做这样的事情:

([^A-Za-z0-9\s]{6}){3}

主要问题

我希望数据捕获代码成为主线程。但是pyqt似乎不允许这种架构,因为其for setting in settings: measurement_equipment.start(setting) gui = LiveDataStreamGUI(measurement_equipment) gui.display() measurement_equipment.capture_data(300) #may take hours gui.close() 是一个阻塞调用,每个进程只能创建一次GUI(例如,在上面的app.exec_()中)。

3 个答案:

答案 0 :(得分:4)

应用程序是在一个或多个前台线程上运行的可执行进程,每个前台线程还可以启动后台线程以执行并行操作或不阻塞调用线程的操作。应用程序将在所有前台线程都结束后终止,因此,您至少需要一个前台线程,在您的情况下,该线程是在调用GridPane grid = new GridPane(); ColumnConstraints cconstraints = new ColumnConstraints(10); RowConstraints rconstraints = new RowConstraints(10); grid.getColumnConstraints().addAll(cconstraints, cconstraints); grid.getRowConstraints().addAll(rconstraints, rconstraints); grid.setGridLinesVisible(true); 语句时创建的。在GUI应用程序中,这是UI线程,您应在其中创建和显示主窗口以及任何其他UI小部件。当所有小部件都关闭时,Qt将自动终止您的申请过程。

恕我直言,您应尽量遵循上述正常流程,工作流程如下:

  

启动应用程序>创建主窗口>为每个计算启动一个后台线程>将进度发送到UI线程>每次计算完成后在窗口中显示结果>关闭所有窗口>结束应用程序

此外,您应该使用app.exec_()来确保不会耗尽资源。

这是一个完整的示例:

ThreadPool

答案 1 :(得分:3)

如果您希望GUI保持实时更新并且不冻结,则有两种主要方式

  1. 不时刷新GUI ,在耗时的函数中调用QApplication.processEvents()
  2. 创建一个单独的线程(我的意思是QThread),在其中运行耗时的函数

我个人的喜好是采用后一种方式。 Here是一个很好的入门教程,介绍如何在Qt中进行多线程。

查看您的代码:

...
gui.display()
measurement_equipment.capture_data(300) #may take hours
gui.close()
...

似乎您正在app.exec_内部呼叫gui.display。很可能您必须将两个函数解耦,并在调用app.exec_之后在gui.display之外调用capture_data。您还必须将新线程的finished信号连接到gui.close。会是这样的:

...
gui.display() # dont call app.exec_ here
thread = QThread.create(measurement_equipment.capture_data, 300)
thread.finished.connect(gui.close)
app.exec_()
...

希望这对您有所帮助,并且不要迟到!

答案 2 :(得分:0)

您只能有一个图形GUI线程。这意味着需要一些线程来捕获数据并在需要时与图形应用程序同步数据。 我们需要知道GUI数据显示是显示实时数据还是仅显示一次。