Pyqt5 on Windows(duplicates the main window when starting the process)
Всем привет, не смог найти ответа на вопрос. Проблема заключается в следующем: 1) Есть приложение на Windows, gui на pyqt5
import sys
import multiprocessing
from multiprocessing import Queue
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout, QTextBrowser
class my_process(multiprocessing.Process):
def __init__(self, queue):
super().__init__()
self.queue = queue
def run(self):
self.queue.put('run')
class my_thread(QThread):
def __init__(self, window, queue):
super().__init__()
self.window = window
self.queue = queue
def run(self):
while True:
command = self.queue.get()
if command == "run":
self.window.my_signal.emit("из IDE при клике на кнопку на экране появляется этот текст")
# После сборки при нажатии на кнопку появляется еще одно окно приложения
# ссылка на собранное приложение https://yadi.sk/d/HZqdZ8Eo16q3bw
class test_multicore(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
# описание интерфейса#######################
self.setGeometry(300, 300, 280, 200)
self.setWindowTitle('Qthreads and multicore')
self.layout = QVBoxLayout(self)
self.testButton = QPushButton("test")
self.testButton.clicked.connect(self.test)
self.command_window = QTextBrowser()
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.command_window)
##########################################
# Сигнал для вывода на экран
self.my_signal.connect(self.my_slot)
self.queue = Queue()
self.my_thread = my_thread(self, self.queue)
self.my_thread.start()
my_signal = pyqtSignal(str)
@pyqtSlot(str)
def my_slot(self, text):
self.command_window.append(text)
def test(self):
self.my_process = my_process(self.queue)
self.my_process.daemon = False
self.my_process.start()
# pyinstaller --onedir probe.py команда для сборки приложения
if __name__ == '__main__':
app = QApplication(sys.argv)
window = test_multicore()
window.show()
app.exec_()
Суть проблемы : Когда я запускаю этот код из IDE всё работает как надо. Но если я собираю проект с помощью Pyinstaller, при запуске нового процесса(при клике на кнопку), моё основное окно дублируется и то что должно было происходить в самом процессе не выполняется. Я думаю что проблема в том что для процессов не задано имя, и он берет имя основного окна, но как это исправить не придумал. Прошу Вашей помощи!
Ответы (1 шт):
https://docs.python.org/2/library/multiprocessing.html#multiprocessing.freeze_support
добавил после запуска программы строчку freeze_support() и проблема решилась
freeze_support()
app = QApplication(sys.argv)
window = test_multicore()
window.show()
app.exec_()