使用Kivy进行调度操作

时间:2017-06-11 11:59:31

标签: python kivy

我试图使用Kivy推迟活动。更具体地说,我想在屏幕上显示文本标签,然后在 N 秒后删除它。 到目前为止,我知道Id无法完成这项工作。相反,我尝试创建一个单独的函数(称为time.sleep),删除屏幕上的任何内容,然后使用eraser()调用它。

这是我到目前为止所做的:

Clock.schedule_once(eraser, n)

那不是真的有用,如果有人能想出正确/更好的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

WidgetCanvas完全不同,因此仅清除画布显然不会删除小部件本身,最后使用此技术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())
相关问题