Мистика 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__':, тогда дополнительные окна не спавнятся.

Другие вопросы по тегам