在子多处理进程(Python3)中打开PyQt5窗口

在子多处理进程(Python3)中打开PyQt5窗口,python,multiprocessing,pyqt5,qwindow,Python,Multiprocessing,Pyqt5,Qwindow,我正在尝试在新进程中打开第二个窗口,以避免使用PyQt5冻结主窗口。因此,我定义了一个新类,该类继承自multiprocessing.Process,并显示窗口。这是主要代码: class GuiMain(QMainWindow): ... # Main window with several functions. When a button is clicked, executes # self.button_pressed() def button_pre

我正在尝试在新进程中打开第二个窗口,以避免使用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()函数时,会显示消息“Opening window..”,但不会发生其他任何事情。没有窗口,没有错误。。。我不知道发生了什么事。提前谢谢你

我找到了一个解决办法。您必须创建一个新的QTL应用程序,并向其附加一个新的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_())

尝试使用
QMainWindow的另一个实例
,并使用方法
exec\uz()
调用它。但这将保持进程运行,直到新实例关闭。。。为什么让
OpenWindowProcess
“睡眠”?为什么需要另一个过程呢?只需在方法中创建一个连接到按钮按下信号的对象并“显示”它…抱歉!我应该把它都读了。我还建议使用
QtCore.QThread
而不是
mp.Process
。这是一个大型项目的一部分,因此我尝试简化示例以澄清问题。我需要其他过程,因为新窗口将显示一些视觉效果,并将监控实时变化的变量,这些函数具有较高的计算成本。关于QThread选项,我可以尝试,但我更喜欢在另一个内核上运行应用程序的这一部分(可以进行多处理,但不能使用线程)。睡眠只是为了看一眼窗户。非常感谢您的回复。我将尝试使用QMainWindow的另一个实例。我不知道可能有几个QMainWindows,“主窗口”只是一个名称。它不意味着像一个单身汉或其他东西。。。