对于我的应用程序中的某些过程,我使用互联网来获取一些数据。因此,对于那些经过处理的人,我希望在过程开始时出现一个简单的弹出框(带有正在加载的文本...),但是当我运行测试代码时,我发现弹出框显示在过程结束时而不是一开始就没有用。这是我正在使用的测试代码。感谢您的帮助。
class ScreenManagement(ScreenManager):
def popup(self):
self.pop_up=Popup(title='Loading...')
self.pop_up.open()
def popup_done(self):
self.pop_up.dismiss()
def ite(self):
for i in range(100):
App.get_running_app().root.current='second'
return i
def thread_it(self,fx):
self.popup()
mythread = threading.Thread(target=fx)
mythread.start()
def ite(self,num):
for i in range(num):
txt=str(i)*40
self.ids.lbl.text=txt
print txt
#if i==num-1: #this is not working
# self.popup_done()
class labelApp(App):
def build(self):
pass
labelApp().run()
.kv文件
ScreenManagement:
Screen:
BoxLayout:
Button:
#on_press:root.popup()
#on_release:root.popup_done()
on_press:root.thread_it(root.ite(40000))
on_press:root.current='second'
Screen:
name:'second'
BoxLayout:
Label:
id:lbl
text: 'hello'
最佳答案
问题出在您的ScreenManagement.ite()
方法上。它不是在线程中运行,并且您已经注意到,任何可能与Kivy主循环竞争并且不在Thread
中运行的事物都会冻结主循环。 Kivy的Clock
也可能使您感兴趣。
但是,对于此确切的代码,您将需要partial
,它将及时冻结函数并返回可以作为参数传递的内容,这样就不会在要添加其作为参数的位置执行它。到线程函数(例如,如果ite()
意味着要执行,则partial
将删除那些括号,并在必要时让Thread
添加它们)Thread(target=fx)
基本上是指通过ite()
方法后的方法:
Thread(target=root.ite(40000))
也就是说,就地运行该东西,并且由于
ite()
方法不返回任何内容,它将执行以下操作:# freeze main loop
# after done, call Thread
Thread(target=None)
并启动它。因此,冻结主循环,在
ite()
结束后,Popup
就会显示出来。让我们用partial
修复它:#:import partial functools.partial
<ScreenManagement>:
Screen:
BoxLayout:
Button:
#on_press:root.popup()
#on_release:root.popup_done()
on_press: root.thread_it(partial(root.ite,400))
on_press: root.current='second'
关于python - 在运行过程结束时显示的kivy弹出窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40452999/