我试图使用Kivy推迟活动。更具体地说,我想在屏幕上显示文本标签,然后在 N 秒后删除它。
到目前为止,我知道Id
无法完成这项工作。相反,我尝试创建一个单独的函数(称为time.sleep
),删除屏幕上的任何内容,然后使用eraser()
调用它。
这是我到目前为止所做的:
Clock.schedule_once(eraser, n)
那不是真的有用,如果有人能想出正确/更好的方法,我将不胜感激。
答案 0 :(得分:1)
Widget
和Canvas
完全不同,因此仅清除画布显然不会删除小部件本身,最后使用此技术FloatLayout
将很多的Label
小部件作为孩子而没有实际删除它们 - 如果你愿意,可以将其称为泄漏:)
小部件使用add_widget()
,remove_widget()
和clear_widgets()
来电,并且每个小组都是with <canvas>
区块的 out ,但是,它可以正常工作即便如此,如果你真的需要它表现得那样。
Clock.schedule_once()
调用使用您传递给它的函数/方法,在您的情况下,它只是eraser()
的返回值(None
)并执行在您用括号(eraser()
→调用,eraser
→只是一个函数)编写它的同一个地方运行。
因此:
add_widget()
,remove_widget()
和clear_widgets()
with <canvas>
块中(大多数情况下不是!)示例:
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.base import runTouchApp
from kivy.uix.floatlayout import FloatLayout
Builder.load_string('''
<Test>:
Button:
size_hint: None, None
on_release: root.test()
''')
class Test(FloatLayout):
def eraser(self, *args):
self.clear_widgets()
def test(self, *args):
lab = Label(text='Hello world!')
self.add_widget(lab)
Clock.schedule_once(self.eraser, 3)
runTouchApp(Test())