在子 multiprocessing.Process (Python3) 中打开 PyQt5 窗口

Posted

技术标签:

【中文标题】在子 multiprocessing.Process (Python3) 中打开 PyQt5 窗口【英文标题】:Open PyQt5 window in child multiprocessing.Process (Python3) 【发布时间】:2018-10-19 07:12:10 【问题描述】:

我正在尝试在新进程中打开第二个窗口,以便不使用 PyQt5 冻结主窗口。为此,我定义了一个继承自multiprocessing.Process 的新类并显示窗口。这是主要代码:

class GuiMain(QMainWindow):
    ...
    # Main window with several functions. When a button is clicked, executes 
    # self.button_pressed()

    def button_pressed(self):
        proc1 = OpenWindowProcess()
        proc1.start()


class OpenWindowProcess(mp.Process)

    def __init__(self):
        mp.Process.__init__(self)
        print(self.pid)

    def run(self):
        print("Opening window...")
        window = QtGui.QWindow()
        window.show()
        time.sleep(10)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    application = GuiMain()
    sys.exit(app.exec_())

进程被创建并获得一个 PID。调用 run() 函数时,会显示消息“正在打开窗口..”,但没有其他任何反应。没有窗口,没有错误……我不知道发生了什么。提前谢谢!

【问题讨论】:

尝试使用QMainWindow 的另一个实例并使用exec_() 方法调用它。但这将保持进程运行,直到新实例关闭......你为什么让OpenWindowProcess“休眠”?为什么需要另一个过程呢?只需在连接到按钮按下信号的方法中创建一个对象并“显示”它... 对不起!应该都读完了。我还建议宁愿使用QtCore.QThread 而不是mp.Process 这是一个大型项目的一部分,因此我尝试简化示例以澄清问题。我需要其他进程,因为新窗口会显示一些视觉效果,并且会实时监控变化的变量,而这些函数的计算成本很高。关于 QThread 选项,我可以尝试,但我更喜欢在另一个内核上运行这部分应用程序(这可以用于多处理,但不能用于线程)。 time.sleep 只是为了看到窗口一秒钟。非常感谢您的回复。 我将尝试使用另一个 QMainWindow 实例。我不知道有可能有几个 QMainWindows “主窗口”只是一个名称。它不应该是单例,否则...... 【参考方案1】:

我已经找到了解决方案。您必须创建一个新的 QtApplication 并附加一个新的 QMainWindow 实例。此代码工作正常:

class GuiMain(QMainWindow):
    ...
    # Main window with several functions. When a button is clicked, executes 
    # self.button_pressed()

    def button_pressed(self):
        proc1 = OpenWindowProcess()
        proc1.start()


class OpenWindowProcess(mp.Process)

    def __init__(self):
        mp.Process.__init__(self)
        print("Process PID: " + self.pid)

    def run(self):
        print("Opening window...")
        app = QApplication(sys.argv)
        window = QMainWindow()
        window.show()
        sys.exit(app.exec_())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    application = GuiMain()
    sys.exit(app.exec_())

【讨论】:

以上是关于在子 multiprocessing.Process (Python3) 中打开 PyQt5 窗口的主要内容,如果未能解决你的问题,请参考以下文章

在子线程中执行主线程方法

在子组件中使用手表是否很糟糕?

在子窗体中保存记录

Selenium Webdriver 在子元素中查找元素

在子控件后面放置一个装饰层

在子图中创建表