2015-04-04 9 views
3

У меня есть этот пример программа, написанная на Python и 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() 

В основном то, что я хочу сделать, это ярлык, который отображает состояние приложения, как: Готово, погрузка, сделано, и т.д., но мой виджет не обновляется текст когда это необходимо.

Что я могу сделать, чтобы немедленно обновить текст самостоятельно .__ label widget?

Я пробовал метод ask_update(), но, похоже, это не работает для этого случая.

ответ

1

Вы блокируете Kivy от чего-либо, когда вы звоните time.sleep. Kivy не может обновлять экран или ввод процесса, пока ваша функция не вернет управление в основной цикл.

Если вы установили source из AsyncImage, изображение будет загружено в фоновом режиме, не блокируя основной цикл. Этот виджет разработан, чтобы просто работать автоматически. Он покажет анимацию загрузки, пока изображение не будет загружено, поэтому вам не нужно показывать какой-либо текст.

Если вы хотите показать свой собственный текст загрузки, вы можете сделать это, используя 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') 
Смежные вопросы