2017-03-22 9 views
0

Nach einem Klick auf die Schaltfläche soll die App eine sehr schwere Tabelle anzeigen, also möchte ich zuerst ein animiertes gif anzeigen und dann die Tabelle anzeigen.Kivy: animiertes Gif zurückgeben und dann ein anderes def aufrufen

wait_image= Loading() 
self.add_widget(wait_image) 
Clock.schedule_once(lambda x: self.DisplayTable(self), 0) 

Aber dies nur laden den ersten Frame des gif animiert:

Wenn die Schaltfläche geklickt wird, wird ein erster def mit dieser genannt. Wenn ich die Clock.schedule durch return self ersetzen, dann sind die animierte GIF funktioniert, aber die DisplayTable def nicht aufgerufen wird:

wait_image= Loading() 
self.add_widget(wait_image) 
return self 

ich versucht, einen anderen def zu nennen, die sich selbst zurück, und fahren Sie dann mit th DisplayTable aber auch doesn ‚t Arbeit (das GIF ist nicht animiert, aber die Tabelle wird angezeigt):

Loading_image(self) 
Clock.schedule_once(lambda x: self.DisplayTable(self), 0) 

mit:

def Loading_image(self): 
    wait_image= Loading() 
    self.add_widget(wait_image) 
    return self 

Wie kann ich also mit einem einfachen Klick ein animiertes gif aufrufen und anzeigen und dann die DisplayTable def aufrufen?


Hier ist die Builder und die Loading Klasse:

Builder.load_string(''' 
<Loading> 
    source : 'loading.zip' 
    anim_delay : 0.02 
    allow_stretch : True 
    keep_ratio : True 
    keep_data : True 
''') 
class Loading(AsyncImage): 
    pass 

Der Code ist here

Antwort

0

Sie müssen die Ereignisschleife Zeit lassen Sie Ihre gif zu aktualisieren ... Verwenden von kivyoav macht es einfach:

from kivyoav.delayed import delayable 

@delayable 
def DisplayTable(self): 
    for i in ROWS: 
     yield 0.01 # after each row the gif will have time to update ... 
     for j in COLS: 
      pass # build your table cols ... 

andere Wahl ist die schwere Arbeit in einem anderen Thread zu tun und nur die Benutzeroberfläche später aktualisieren Clock.schedule_once

def build_table(): 
    ... 
    #stuff that take time 
    stuff = ... 
    ... 
    Clock.schedule_once(lambda dt: build_ui_table(stuff)) #since you can use the UI only from the main thread 
threading.Thread(target=build_table).start() 
+0

Dank Yoav verwenden. Ich konnte mit deinem Plugging das animierte gif bekommen, aber es läuft nicht reibungslos. Der Tisch braucht ungefähr 15 Sekunden, um erstellt zu werden: Das GIF wird für ungefähr 2 Sekunden animiert, dann bleibt es für ungefähr 8 Sekunden hängen und dann bewegt es sich langsam für die 2 Sekunden und dann bleibt es ein anderes Mal für die letzten 3 Sekunden stecken. Während der 15 Sekunden erstellt mein Code ein BoxLayout mit vielen Zeilen, die jeweils mehrere scrollbare Labels enthalten. Das ganze BoxLayout ist selbst scrollbar. Danach füge ich das BoxLayout sofort zur App hinzu, so dass ich nicht verstehe, warum die .gif-Datei die meiste Zeit stecken bleibt. – Enora

+0

Ich werde schwer sein, ohne in Code zu helfen, hast du versucht, die ** Ausbeute ** an mehr Orten zu setzen? (vielleicht für jede Zelle, die Ihr Gebäude?) –

+0

Ja, das ist besser, aber jetzt geht das .gif manchmal zurück und auch die vielen Erträge verlangsamen wirklich die Programme (mehr als 3 Minuten im Vergleich zu 15 Sekunden vorher). Ich habe den Code auf https://github.com/EnoraNedelec/FoldersManager gestellt. Der relevante Teil sind '## 3' '## 5' und' # anim_gif' in FoldersManager.py – Enora

Verwandte Themen