我有这个用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()方法,但似乎对这种情况不起作用。
答案 0 :(得分:2)
当你致电time.sleep
时,你阻止Kivy做任何事情。在您的函数将控制权返回到主循环之前,Kivy无法更新屏幕或处理输入。
当您设置source
的{{1}}时,图像将在后台下载,而不会阻止主循环。此小部件旨在自动运行。它将显示加载动画,直到下载图像为止,因此您无需显示任何文本。
但是,如果要显示自己的加载文本,可以直接使用Loader
来执行此操作。它将返回ProxyImage
,您可以使用它来确定图像的加载时间:
AsyncImage