Откройте окно PyQt5 в дочерней многопроцессорной обработке. Процесс (Python3) - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь открыть второе окно в новом процессе, чтобы не заморозить главное окно с помощью 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 (), отображается сообщение «Открывающееся окно ..», но больше ничего не происходит. Нет окна, нет ошибки ... Я не могу понять, что происходит. Заранее спасибо!

1 Ответ

0 голосов
/ 09 мая 2018

Я пришел к решению. Вы должны создать новое приложение 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_())
...