我正在尝试在运行另一个python脚本时获取加载循环的gif来播放。

当我单击一个按钮时,我得到一个带有加载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



主.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

最佳答案

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

    time.sleep(1)
    t.join()


以允许GUI运行。

10-07 13:05
查看更多