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

时间:2015-04-04 12:08:42

标签: python 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 widget中的文字?

我尝试过ask_update()方法,但似乎对这种情况不起作用。

1 个答案:

答案 0 :(得分:2)

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

当您设置source的{​​{1}}时,图像将在后台下载,而不会阻止主循环。此小部件旨在自动运行。它将显示加载动画,直到下载图像为止,因此您无需显示任何文本。

但是,如果要显示自己的加载文本,可以直接使用Loader来执行此操作。它将返回ProxyImage,您可以使用它来确定图像的加载时间:

AsyncImage