@MegaTort

Как сконвертировать проект с PyQt5 и multiprocessing в exe?

У меня есть не большой проект на Python
Графическое приложение на PyQt запускается в основном процессе, второй процесс запускается во отдельном процессе. Связываю я процессы через Process.Manager.
Если работать через IDE, то проблем нет, а если начинаю конвертировать в exe через pyinstaller, то программа работает не правильно.
Написал код, который в целом описывает работу моей программы. После конвертирования в exe и нажатии запуска второго процесса, запускается дубликат GUI, а не второй процесс.

import sys
import time

from PyQt5 import QtGui, QtCore, QtWidgets
from multiprocessing import Process, Value, Manager


class Window(QtWidgets.QMainWindow):
    def __init__(self, value: Value):
        super().__init__()
        self.init()

        self.value = value
        self.flag_process = False
        self.process = None

        self.threa_listen = ThreadListenProcess(value=self.value)
        self.threa_listen.signal_listen_process.connect(self.listen_process)
        self.threa_listen.start()

    def init(self):
        self.central_widget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.central_widget)

        self.centralGridLayout = QtWidgets.QGridLayout(self.central_widget)
        self.central_widget.setLayout(self.centralGridLayout)

        self.btn_start_process = QtWidgets.QPushButton(self)
        self.btn_start_process.setText('СТАРТ')
        self.btn_start_process.clicked.connect(self.start_process)
        self.centralGridLayout.addWidget(self.btn_start_process)

        self.btn_stop_process = QtWidgets.QPushButton(self)
        self.btn_stop_process.setText('СТОП')
        self.btn_stop_process.clicked.connect(self.stop_process)
        self.centralGridLayout.addWidget(self.btn_stop_process)

    def start_process(self):
        self.flag_process = True
        self.process = MyProcess(value=self.value)
        self.process.start()

    def stop_process(self):
        self.flag_process = False
        self.process.kill()

    def listen_process(self, value: int):
        print(value)

    def closeEvent(self, a0) -> None:
        if self.flag_process:
            self.process.kill()
        super(Window, self).closeEvent(a0)


class ThreadListenProcess(QtCore.QThread):
    signal_listen_process = QtCore.pyqtSignal(int)

    def __init__(self, value: int):
        super().__init__()
        self.value: Value = value

    def run(self) -> None:
        while True:
            self.signal_listen_process.emit(self.value.value)
            time.sleep(1)


class MyProcess(Process):
    def __init__(self, value: int):
        super().__init__()
        self.value: Value = value

    def run(self):
        while True:
            self.value.value += 1
            time.sleep(1)


if __name__ == '__main__':
    manager = Manager()
    v = manager.Value('i', 0)

    app = QtWidgets.QApplication(sys.argv)
    window = Window(value=v)

    window.show()
    sys.exit(app.exec_())
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
@MegaTort Автор вопроса
Вопрос решён
Необходимо добавить вызов функции multiprocessing.freeze_support() в блок if __name__ == "__main__":.
Это позволит избежать ошибок при запуске скомпилированного файла
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы