2016-11-06 57 views
1

对于我的应用程序中的某些过程,我使用互联网来获取一些数据。所以对于那些处理过的我想要一个简单的弹出框(带有文本加载...)出现在进程开始时,但是当我运行测试代码时,我发现弹出框显示在进程结束时而不是在使其无用的过程开始时。这是我正在使用的测试代码。感谢您的帮助,谢谢。在运行过程结束时显示kivy弹出窗口

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' 

回答

2

问题是与你的ScreenManagement.ite()方法。它不会在线程中运行,你已经注意到任何可能与Kivy的主循环竞争,并且不会运行在Thread将冻结主循环。 Kivy有Clock这也许会让你感兴趣。

对于这个确切的代码,你需要partial,它会及时冻结一个函数并返回一个你可以作为参数传递的东西,这样它就不会在你要添加的地方作为参数参数传递给线程函数(例如,如果ite()手段执行,partial会删除这些括号,让Thread加入他们时,有必要)传递ite()方法基本上这之后

Thread(target=fx)表示:

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' 
+0

谢谢,这解决了我的问题! – Linh