Мистика Python GUI (Kivy) и Multiprocessing | При создании процесса открывается ещё одно окно GUI
Вот мой простенький код, который при нажатии на кнопку должен запускать функцию run_bot():
from kivy.app import App
from kivy.uix.button import Button
import multiprocessing as mp
import time
def run_bot():
while True:
print('Working...')
time.sleep(2)
class MyApp(App):
def build(self):
self.btn=Button(
text='Старт',
font_size=30,
on_press=self.start,
background_color=(1,3,3,10)
)
return self.btn
def start(self,instance):
self.proc=mp.Process(target=run_bot)
self.proc.daemon=True
self.proc.start()
if __name__ == '__main__':
MyApp().run()
При запуске этого файла .py двойным щелчком, открывается терминал, GUI, и код работает без нареканий. (Работаю через обычный IDLE 3.9)
Однако, если Python файл скомпилировать в .exe при помощи того же pyinstaller, когда я нажимаю кнопку, в моём приложении, то программа накладывает поверх основго окна приложения ещё одно, и так можно создать хоть 200 одинаковых окон. При этом скрипт run_bot() не запускается. (Компилирую с терминалом, конечно же.)
Вся суть проблемы на *видеозаписи*
Прошу помощи у экспертов, спасибо.
1 ответ
Решение 1:
В pyinstaller (и других "компиляторах") для мультипроцессорных приложений нужно сделать mp.freeze_support()
сразу после if __name__ == '__main__':
.
Решение 2:
В общем, есть такое issue: https://github.com/kivy/kivy/issues/4744
В первом сообщении, как я понял, товарищ пишет, что приходится импорты самого kivy (ну и соответственно весь код от них зависящий) прятать под if __name__ == '__main__':
, тогда дополнительные окна не спавнятся.