2017-03-22 25 views
0

點擊一個按鈕後,應用程序應該顯示一個非常沉重的表,所以我想先顯示一個動畫gif,然後顯示錶。Kivy:返回動畫gif,然後調用另一個def

當點擊該按鈕時,第一DEF被調用,此:

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

但這僅加載動畫gif的第一幀。如果我更換Clock.schedule通過return self,那麼gif動畫作品,但DisplayTable高清不叫:

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

我試圖調用另一個DEF將返回自我,再入手個DisplayTable但是這也沒有按「T工作(.gif文件沒有設置動畫,但顯示錶):

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

有:

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

那麼,如何通過簡單的點擊來調用並顯示一個動畫gif,然後繼續調用DisplayTable def?


這裏是BuilderLoading類:

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

的代碼是here

回答

0

你需要讓事件循環時間更新您的GIF ...使用kivyoav使其變得簡單:

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

另一種選擇是執行繁重的工作在不同的線程,並只更新UI以後使用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

感謝約阿夫。我可以用插件來獲取動畫gif,但運行不順暢。表格需要大約15秒的時間來創建:GIF動畫約2秒,然後卡住約8秒,然後緩慢移動2秒,然後在最後3秒內卡住另一個時間。在15秒內,我的代碼正在構建一個包含多個可滾動標籤的多行的BoxLayout。整個BoxLayout本身是可滾動的。之後,我將BoxLayout一次添加到應用程序中,所以我不明白爲什麼.gif大部分時間都卡住了。 – Enora

+0

如果沒有代碼,我會很難提供幫助,你是否嘗試在更多地方提供** yield **? (也許對於你的建築物的每個單元格) –

+0

是的,這是更好的,但現在.gif有時會返回,而且許多收益率實際上正在減慢程序的速度(超過3分鐘與之前的15秒相比)。我把代碼放在https://github.com/EnoraNedelec/FoldersManager。相關部分是FoldersManager.py中的## 3'' ## 5'和'#anim_gif'。 – Enora

相關問題