2016-11-06 92 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