我正在尝试在运行另一个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运行。