Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非阻塞PyQT作为可视化主进程结果的附加GUI?_Python_User Interface_Pyqt5 - Fatal编程技术网

Python 非阻塞PyQT作为可视化主进程结果的附加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

我有一个主进程,它可以做一些事情(例如分析数据),并且单独运行就可以了。我还想制作一个简单的GUI,使用PyQT5显示主任务的结果。这个想法是GUI不应该干扰主进程,也就是说,如果我删除GUI,它不应该对主进程造成任何问题

主流程的代码非常简单:

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()