对于我应用中的某些流程,我使用互联网获取一些数据。所以对于那些处理过的我想要一个简单的弹出框(带有文本Loading ...)出现在流程的开头,但是当我运行测试代码时,我发现弹出框在流程结束时显示而不是在使它无用的过程的开始。这是我正在使用的测试代码。感谢您的帮助。
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'
答案 0 :(得分:2)
问题在于您的Thread
方法。它 没有 在线程中运行,你已经注意到任何可以与Kivy的主循环竞争的东西并没有在ite()
中运行会冻结主循环。 Kivy的Clock
也可能让你感兴趣。
对于这个确切的代码,你需要partial
,它会及时冻结一个函数并返回一个你可以作为参数传递的东西,这样它就不会被就地执行你想把它作为一个参数添加到一个线程函数(例如,如果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'
修复它:
spark.read.format("csv").option("inferSchema", true).load(...)
.toDF("sepalWidth", "sepalLength", "petalWidth", "petalLength", "irisClass")
.as[Iris]