如何立即更新 Kivy 中的小部件?

How to immediately update widget in Kivy?

我用 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()

基本上我想要做的是显示应用程序状态的标签,例如:就绪、加载、完成等,但我的小部件没有在应该更新文本的时候更新文本。

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

我试过 ask_update() 方法,但它似乎不适用于这种情况。

当您调用 time.sleep 时,您正在阻止 Kivy 做任何事情。在你的函数 returns 控制到主循环之前,Kivy 无法更新屏幕或处理输入。

当您设置AsyncImagesource时,图片将在后台下载,不会阻塞主循环。这个小部件被设计成自动工作。在图片下载完成之前,它会显示加载动画,因此您不需要显示任何文字。

但是,如果您想显示自己的加载文本,可以使用 Loader directly. It will return a 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')