У меня есть не большой проект на 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_())