2015-04-04 50 views
3

我用Python編寫的Kivy本示例程序:如何在Kivy中立即更新小部件?

#!/usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

import time 
from kivy.app import App 
from kivy.core.window import Window 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.image import AsyncImage 
from kivy.uix.label import Label 


class Application(App): 

    def build(self): 
     keyboard = Window.request_keyboard(None, self) 
     keyboard.bind(on_key_down=self.__on_key_down) 

     box_layout = BoxLayout(orientation='vertical') 

     self.__label = Label(text='Ready') 
     box_layout.add_widget(self.__label) 

     self.__img = AsyncImage() 
     box_layout.add_widget(self.__img) 

     return box_layout 

    def __on_key_down(self, keyboard, keycode, text, modifiers): 
     self.__set_status('Loading, please wait...') 
     print(self.__label.text) 
     time.sleep(3) # simulates long image download time 
     self.__img.source = 'http://pl.python.org/forum/Smileys/default/cheesy.gif' 

    def __set_status(self, text): 
     self.__label.text = text 
     # self.__label.canvas.ask_update() 


app = Application() 
app.run() 

基本上就是我想要做的是標籤,該標籤顯示的應用程序一樣的狀況:準備,裝載,完成等,但我的窗口小部件沒有更新文本當它應該。

如何立即更新self .__ label小部件中的文本?

我試過ask_update()方法,但它似乎不適用於這種情況。

回答

1

當您致電time.sleep時,您會阻止Kivy做任何事情。 Kivy無法更新屏幕或過程輸入,直到您的功能將控制權歸還給主循環。

當您設置AsyncImagesource時,圖像將在後臺下載而不會阻塞主循環。此小部件旨在自動工作。它會顯示一個加載動畫,直到下載圖像,所以你不需要顯示任何文本。

但是,如果您想顯示自己的加載文本,可以直接使用Loader來完成。它會返回一個ProxyImage,您可以使用它來確定圖像何時加載:

def __on_key_down(self, keyboard, keycode, text, modifiers): 
    self.__set_status('Loading, please wait...') 
    proxy = Loader.image('http://pl.python.org/forum/Smileys/default/cheesy.gif') 
    proxy.bind(on_load=self.__image_loaded) 

def __image_loaded(self, proxy): 
    if proxy.image.texture: 
     self.__img.texture = proxy.image.texture 
     self.__set_status('Done')