Python 非阻塞PyQT作为可视化主进程结果的附加GUI?
我有一个主进程,它可以做一些事情(例如分析数据),并且单独运行就可以了。我还想制作一个简单的GUI,使用PyQT5显示主任务的结果。这个想法是GUI不应该干扰主进程,也就是说,如果我删除GUI,它不应该对主进程造成任何问题 主流程的代码非常简单:Python 非阻塞PyQT作为可视化主进程结果的附加GUI?,python,user-interface,pyqt5,Python,User Interface,Pyqt5,我有一个主进程,它可以做一些事情(例如分析数据),并且单独运行就可以了。我还想制作一个简单的GUI,使用PyQT5显示主任务的结果。这个想法是GUI不应该干扰主进程,也就是说,如果我删除GUI,它不应该对主进程造成任何问题 主流程的代码非常简单: if __name__ == '__main__': # initialize the object that performs the main task tasker = Task() # the graphical in
if __name__ == '__main__':
# initialize the object that performs the main task
tasker = Task()
# the graphical interface to visualize the result of tasker
gui = GUI(task) # GUI is a separate class that keeps a reference to tasker
# read the input data and do stuff on each new data instance
for f in listdir(inrepo):
data = read_new_data(f) # an utility function that reads new data from file
result = tasker.process(data) # tasker processes the new data and return some results
gui.update(data, result) # pass the data and result in the GUI to update it
GUI类的代码很长,所以我只在这里粘贴了几行,但我跳过的几行只是为了创建小部件,没有什么特别之处(我还没有连接任何事件)
所以我希望GUI完全独立于我的主进程。例如,如果我不再需要GUI,我可以只注释掉两行GUI=GUI(任务)
和GUI.update(数据、结果)
但是,问题是启动GUI会阻塞整个进程(我假设这是因为GUI中的self.exec()
我考虑过的一些选择:
线程化:对于我的用例来说,它似乎比必要的要复杂得多,这可能会使从线程引用任务
实例变得困难。对任务
的所有新更新都应该反映在GUI中。如果我没有弄错的话,PyQT的应用程序已经在线程上运行了。因此,可能需要使用多级线程令人难以置信
从另一个Python进程运行GUI,通过共享文件夹进行通信:可能会产生很高的延迟。任务
产生的任何新数据和结果应立即反映在GUI中。写入文件,然后从文件读取,然后更新GUI将导致一些延迟
在GUI
中执行任务:我可以使用一些超时事件定期读取新数据并对它们运行task
,但是所有事情都严重依赖于GUI,如果我不再需要GUI,我不能只注释它
非常感谢您的建议!非常感谢!在GUI模式/控制台模式之间切换您的程序通常不像注释掉一些行那么简单。尤其是PyQt不允许您从主线程以外的任何地方运行GUI循环。不过,并不是所有的希望都破灭了-这只是意味着您应该决定使用e无论您的程序是作为控制台应用程序运行还是作为GUI运行,都应尽早启动
您可以在代码内部创建一个“开关”,告诉代码如何执行,而不是依赖于注释代码。一种方法是在执行代码时检查命令行参数,例如:
import sys
if "--headless" in sys.argv[1:]: # checking the command-line arguments
run_code_without_gui()
else:
run_code_with_gui()
这样,以python mycode.py--headless
的形式执行代码将在没有GUI的情况下执行(通过run\u code\u without\u GUI
函数),而执行python mycode.py
将以GUI的形式运行代码(通过run\u code\u withu GUI
函数)。(尽管如果您实际上要解析命令行参数,我建议使用)
您甚至可以将分析代码与GUI代码完全分离,以便在不使用GUI的情况下执行时,只需从(例如,analysis.py
)运行函数,并在用户单击“分析”按钮时让GUI调用完全相同的函数
另一件需要注意的事情是,如果您的分析代码需要很长时间才能执行,它可能会无意中阻塞GUI。在这种情况下,您应该在单独的“工作”线程中运行分析代码,该线程在单击“分析”后生成按钮,使GUI在执行时保持响应。如果您希望分析无限期地与GUI一起运行,这可能是一种方法-在向用户显示GUI的同时为分析创建工作线程。我明白了。非常感谢您的全面回答!我非常感谢!
import sys
if "--headless" in sys.argv[1:]: # checking the command-line arguments
run_code_without_gui()
else:
run_code_with_gui()