如何立即更新 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 无法更新屏幕或处理输入。
当您设置AsyncImage
的source
时,图片将在后台下载,不会阻塞主循环。这个小部件被设计成自动工作。在图片下载完成之前,它会显示加载动画,因此您不需要显示任何文字。
但是,如果您想显示自己的加载文本,可以使用 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')
我用 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 无法更新屏幕或处理输入。
当您设置AsyncImage
的source
时,图片将在后台下载,不会阻塞主循环。这个小部件被设计成自动工作。在图片下载完成之前,它会显示加载动画,因此您不需要显示任何文字。
但是,如果您想显示自己的加载文本,可以使用 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')