如何在kivy中自我更新时钟标签?

时间:2015-05-12 14:03:02

标签: python label kivy clock

我想创建一个充当时钟的标签,每隔一秒更新一次,就像在making-a-clock-in-kivy链接中一样,但在状态栏中。

我希望带有 id:_tnd status.kv 文件中的标签充当时钟。 更新函数(test_gui.py)中的print语句可以正常工作,并在每秒后在控制台中打印日期和时间,但标签不会更新。我现在很困惑!这可能是一个愚蠢的错误,但我该怎么做?

我有3个文件

  1. test_gui.py
  2. test.kv
  3. status.kv
  4. test_gui.py文件

    import time
    from kivy.app import App
    from kivy.clock import Clock
    from kivy.lang import Builder
    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import ObjectProperty
    from kivy.properties import StringProperty
    
    Builder.load_file('status.kv')
    
    class Status(BoxLayout):
        _change = StringProperty()
        _tnd = ObjectProperty(None)
        def update(self,*args):
            self.time = time.asctime()
            self._change = str(self.time)
            self._tnd.text = str(self.time)
            print self._change
    
    class C(BoxLayout):
        pass
    
    
    class TimeApp(App):
        def build(self):
            self.load_kv('test.kv')
            crudeclock = Status()
            Clock.schedule_interval(crudeclock.update, 1)
            return C()
    
    if __name__ == "__main__":
        TimeApp().run()
    

    test.kv文件

        <C>:
        BoxLayout:
            orientation: 'vertical'
            BoxLayout:
                Button:
                    text: "Button"
                Label:
                    text: "Label"
            Status:
    

    status.kv文件

        <Status>:
        size_hint: 1,.1
        _tnd: _tnd
        canvas.before:
            Color:
                rgba: 0,0,0,1
            Rectangle:
                pos: self.pos
                size: self.size
        Label:
            text:'Current Date and Time:'
        Label:
            id: _tnd
            text: root._change +' time'
    

1 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。最大的是build(self)函数:

def build(self):
    self.load_kv('test.kv')
    crudeclock = Status()
    Clock.schedule_interval(crudeclock.update, 1)
    return C()

您正在创建一个Status对象并设置一个时钟来调用它的更新功能,但它是您显示器的一部分。它是Status的独立独立实例,未附加到窗口小部件树。当您返回C()时,它会创建test.kv中定义的窗口小部件树,其中包含自己的内部Status实例,该实例未更新。

第二个问题是您将Label的文本字段绑定到.kv文件中的属性,然后还在回调中手动更改它。我猜你试过一个然后另一个看看是否有效。如果您使用正确的对象,两者都可以工作,但您只想使用一个。

就访问正确的Status对象而言,修复代码的最简单方法是在test.kv中标记它,然后在build(self)中访问它:

<C>:
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            Button:
                text: "Button"
            Label:
                text: "Label"
        Status:
            id: stat

def build(self):
    self.load_kv('test.kv')
    c = C()
    stat = c.ids.stat  # this is the right object
    Clock.schedule_interval(stat.update, 1)
    return c

替代,因为您真的只需要为整个应用程序保留一次,就是将属性放在app类中并在kv文件中绑定它:

    time = StringProperty()

    def update(self, *args):
        self.time = str(time.asctime()) # + 'time'?

    def build(self):
        self.load_kv('test.kv')
        Clock.schedule_interval(self.update, 1)
        return C()

<Status>:
    size_hint: 1,.1
    canvas.before:
        Color:
            rgba: 0,0,0,1
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        text:'Current Date and Time:'
    Label:
        text: app.time

看起来更干净。