2017-03-22 1 views
0

Après avoir cliqué sur un bouton, l'application est censée afficher une table très lourde, donc je voudrais d'abord afficher une animation gif puis afficher la table.Kivy: retour d'un gif animé puis appel d'un autre

Lorsque le bouton est cliqué, une première définition est appelée avec ceci:

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

Mais cette charge seule la première image de la gif animée. Si je remplace le Clock.schedule par return self, alors les œuvres de GIF animés, mais la définition DisplayTable n'est pas appelé:

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

J'ai essayé d'appeler une autre définition qui renverra soi-même, puis procéder à e DisplayTable mais aussi doesn « t travail (.gif n'est pas animé, mais la table est affichée):

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

avec:

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

Alors, comment puis-je, avec un simple clic, appelé et afficher un gif animé, puis procéder à appeler le DisplayTable def?


Voici le Builder et la Loading classe:

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

Le code est here

Répondre

0

Vous devez laisser le temps de boucle d'événement pour mettre à jour votre gif ... En utilisant kivyoav c'est simple:

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 ... 

Un autre choix est de faire le levage de charges lourdes dans un autre thread et seulement mettre à jour l'interface utilisateur plus tard à l'aide 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

Merci Yoav. Avec votre branchement, j'ai réussi à obtenir le gif animé, mais il ne fonctionne pas correctement. La table prend environ 15 secondes à créer: le gif est animé pendant environ 2 secondes, puis il reste coincé pendant environ 8 secondes, puis il se déplace lentement pendant les 2 secondes, puis il se coince une autre fois pendant les 3 dernières secondes. Pendant les 15 secondes, mon code construit un BoxLayout avec plusieurs lignes contenant chacune plusieurs étiquettes déroulantes. L'ensemble BoxLayout est lui-même scrollable. Après cela, j'ajoute le BoxLayout à la fois à l'application, donc je ne comprends pas pourquoi le .gif reste bloqué la plupart du temps. – Enora

+0

Je vais être difficile à aider sans code, avez-vous essayé de mettre le ** rendement ** dans plus d'endroits? (peut-être pour chaque cellule que votre bâtiment?) –

+0

Oui, c'est mieux, mais maintenant le .gif est parfois de retour et aussi les nombreux rendements ralentissent vraiment les programmes (plus de 3 min comparé à 15 sec avant). J'ai mis le code à https://github.com/EnoraNedelec/FoldersManager. La partie pertinente est '## 3'' ## 5' et '# anim_gif' dans le FoldersManager.py – Enora