Как заставить загрузочный GIF работать во время выполнения команды - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь получить gif загрузочного круга, пока я запускаю другой скрипт python.

Когда я нажимаю кнопку, я получаю всплывающее окно с загрузочным GIF, в фоновом режиме я хочу запустить скрипт python, пока этот GIF загружается. Как только скрипт завершится, всплывающее окно закрывается.

Пока все это работает, за исключением того, что gif зависает, как только запускается другой скрипт python.

Я пытался использовать os.system(), subprocess.run() и спорный subprocess.Popen(). Я также пытался использовать многопроцессорные и многопроцессорные модули python.

Потоки, кажется, способ до go, но я все равно получаю тот же результат (gif-зависание, когда я запускаю другой python) скрипт).

Я знаю, что есть много других подобных вопросов, однако я могу заверить вас, что прочитал их все и попробовал их решения, но по какой-то причине они не работают для меня. Я работал над этим в течение нескольких дней и не могу найти решение, поэтому любая помощь будет принята с благодарностью.

Для общей картины я пишу python3 .7 приложение, использующее kivy для создания GUI , Я запускаю это приложение на Raspberry Pi 4.

Ниже приведены фрагменты моего текущего соответствующего кода: («...» указывает, где находится другой не относящийся к делу код)

main .py

class SetttingsWindow(Screen):
    def __init__(self, **kwargs):
        super(SettingsWindow, self).__init__(**kwargs)
        Clock.schedule_interval(self.check, 1)

    def check(self, dt):
        global wset
        if wset:
            self.start_thread()
        else:
            pass

    def start_thread(self):
        t = threading.Thread(target=self.connect)
        t.start()
        time.sleep(1)
        t.join()

    def connect(self):
        global wset
        os.system('sudo python /home/pi/app/connect.py')
        wset = False
        loadingPopup.dissmiss()

    def set(self):
        Popup.open()


class PopUp(FloatLayout):
    def __init__(self, **kwargs):
        super(PopUp, self).__init__(**kwargs)

    def change(self):
        global wset
        if ... :
            PopUp.dismiss()
        else:
            ...
            PopUp.dissmiss()
            wset = True

    def setLoad(self):
        loadingPopup.open()


class LoadingPopUp(FloatLayout):
    pass

main.kv

<SettingsWindow>
    ...
    Button:
        text: "Setup"
        on_release:
            root.set()
    ...
...
<PopUp>
    ...
    Button:
        text: "Set"
        on_release:
            root.change()
            root.setLoad()
    ...
...
<LoadingPopUp>
    Image:
        source: "loading.gif"
        anim_delay: 0.05
        keep_data: True

1 Ответ

0 голосов
/ 28 февраля 2020

Ваш метод check() будет запущен в главном потоке (как вызывается Clock.schedule_interval). Этот метод вызывает start_thread, который запускает новый поток для запуска вашего connect метода. Все в порядке, но затем вы вызываете t.join(), который останавливает основной поток, пока ваш метод connect не завершится. В ожидании завершения потока connect ваш GUI полностью остановится. Я предлагаю удалить строки:

    time.sleep(1)
    t.join()

, чтобы позволить GUI работать.

...