我如何构建代码以在一个进程中连续多次运行pyqt GUI
(如果相关,请具体说明pyqtgraph)
在测量设备上执行长时间运行的数据捕获的python脚本(大for循环)。在每次捕获迭代期间,会出现一个新的GUI,并在主捕获代码运行时向用户显示测量设备的实时数据
我想这样做:
for setting in settings:
measurement_equipment.start(setting)
gui = LiveDataStreamGUI(measurement_equipment)
gui.display()
measurement_equipment.capture_data(300) #may take hours
gui.close()
我希望数据捕获代码成为主线程。然而pyqt似乎不允许这种架构,因为它的app.exec_()
是一个阻塞调用,只允许每个进程创建一次GUI(例如,在上面的gui.display()
)
如果您希望GUI在实时中不断更新,并且不被冻结,您有两种主要方法来实现这一点:
QApplication.processEvents()
李>QThread
),在那里运行耗时的函数我个人倾向于选择后一种方式Here是一个很好的教程,可以帮助您开始学习如何在Qt中执行多线程
查看您的代码:
似乎您正在
app.exec_
内调用gui.display
。很可能您必须将这两个函数解耦,并在gui.display
之外和调用capture_data
之后调用app.exec_
。您还必须将新线程的finished
信号连接到gui.close
。它将是这样的:我希望这能帮助你,不要迟到
您只能有一个图形GUI线程。这意味着需要一些线程来捕获数据,并在需要时与图形应用程序同步数据。 我们需要知道GUI数据显示是显示实时数据还是仅显示一次
应用程序是在一个或多个前台线程上运行的可执行进程,每个前台线程还可以启动后台线程来执行并行操作或操作,而不会阻塞调用线程。应用程序将在所有前台线程结束后终止,因此,在您的情况下,至少需要一个前台线程,该线程是在调用
app.exec_()
语句时创建的。在GUI应用程序中,这是UI线程,您应该在其中创建并显示主窗口和任何其他UI小部件。当所有窗口小部件关闭时,Qt将自动终止您的应用程序进程IMHO,您应该尽可能地遵循上面描述的正常流程,工作流可以如下所示:
另外,您应该使用
ThreadPool
来确保资源不会耗尽下面是一个完整的示例:
相关问题 更多 >
编程相关推荐