如何在运行命令时获取加载的gif文件

问题描述 投票:1回答:1

我正在尝试获取一个加载圆圈的gif以便在运行另一个python脚本时播放。

当我单击按钮时,会弹出一个带有加载gif的弹出窗口,在后台,我想在加载gif时运行python脚本。脚本完成后,弹出窗口关闭。

到目前为止,除了gif在其他python脚本开始运行后冻结之外,所有这些工作都有效。

我曾尝试使用os.system()subprocess.run()和有争议的subprocess.Popen()。我也尝试过使用线程和多处理python模块。

线程似乎是要走的路,但是我仍然得到相同的结果(一旦我开始运行其他python脚本,gif就会冻结)。

我知道还有很多其他类似的问题,但是我可以向您保证,我已经阅读了所有问题并尝试了解决方案,但是由于某些原因,它们对我不起作用。我已经为此工作了好几天,无法找到解决方案,因此将不胜感激。

[总体而言,我正在使用kivy编写python3.7应用程序来创建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
python bash kivy python-multithreading animated-gif
1个回答
0
投票

您的check()方法将在主线程中运行(由Clock.schedule_interval调用)。该方法调用start_thread,这将启动一个新线程来运行您的connect方法。一切都很好,但是您调用了t.join(),它将停止主线程,直到connect方法完成。在等待connect线程完成时,您的GUI将完全停止。我建议删除这些行:

    time.sleep(1)
    t.join()

以允许GUI操作。

© www.soinside.com 2019 - 2024. All rights reserved.