2016-11-06 17 views
1

私のアプリのいくつかのプロセスでは、インターネットを使ってデータを取得しています。だから私はプロセスの最初に表示する単純なポップアップボックス(テキストLoading ...)が欲しいが、テストコードを実行すると、プロセスの最後にポップアップボックスが表示されることがわかったそれは無駄になるプロセスの初めよりも。ここで私が使用しているテストコードです。あなたの助けに感謝します、ありがとう。実行中のプロセスの終了時に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はそれらを追加してみましょう)

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

ありがとう、これは私の問題を解決します! – Linh

関連する問題