2016-11-06 5 views
1

Für einen Prozess angezeigt wird, nutze ich das Internet, einige Daten zu erwerben. Also für die verarbeiteten möchte ich eine einfache Popup-Box (mit einem Text Loading ...) am Anfang des Prozesses angezeigt werden, aber wenn ich den Testcode ausgeführt habe, habe ich beobachtet, dass das Popup-Fenster am Ende des Prozesses eher angezeigt wird als am Anfang des Prozesses, der es nutzlos macht. Hier ist der Testcode, den ich verwende. Ihre Hilfe wird geschätzt, danke.Kivy Popup am Ende eines laufenden Prozesses in meinem app

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 Datei

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' 

Antwort

2

Das Problem ist, mit Ihrem ScreenManagement.ite() Methode. Es nicht in Thread laufen und Sie haben bereits bemerkt, dass alles, was mit Kivy Hauptschleife konkurrieren könnte und nicht in Thread laufen wird die Hauptschleife einfrieren. Kivy hat Clock das könnte dich auch interessieren.

Für diese genaue Code jedoch benötigen Sie partial, die eine Funktion in der Zeit einfrieren und eine Sache zurückgeben, die Sie als Argument übergeben können, so dass es nicht in Ort ausgeführt würde, wo Sie es als hinzufügen möchten Argument an eine Thread-Funktion (zB wenn ite() Mittel ausgeführt wird, wird partial jene Klammern zu entfernen und läßt Thread sie hinzufügen, wenn es notwendig ist)

Thread(target=fx) Mittel nach den ite() Verfahren grundsätzlich ist diese vorbei:

Thread(target=root.ite(40000)) 

i. E. Läuft das Ding an Ort und Stelle und als ite() Methode nicht alles zurückgeben, wird es dies tun:

# freeze main loop 
# after done, call Thread 
Thread(target=None) 

und startet es. So frieren Sie Ihre Hauptschleife und nach den ite() Enden, die Popup bekommt seinerseits zu zeigen. Lassen Sie uns es mit beheben:

#: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

Danke, das löst mein Problem! – Linh

Verwandte Themen