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

Posted

技术标签:

【中文标题】如何在kivy中制作自我更新时钟标签?【英文标题】:how to make self updating clock label in kivy? 【发布时间】:2015-07-23 11:12:12 【问题描述】:

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

我希望 status.kv 文件中带有 id: _tnd 的标签用作时钟。 更新函数 (test_gui.py) 中的打印语句确实有效,并且每秒在控制台中打印日期和时间,但标签没有更新。我现在很困惑!这可能是一个愚蠢的错误,但我该怎么做呢?

我有 3 个文件

    test_gui.py test.kv status.kv

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'

【问题讨论】:

***.com/questions/23817559/… @stark 在链接中,它会在事件发生时更新值(单击按钮)。但是在这里它需要在没有任何事件的情况下更新。 self.time 的值,它是一个字符串(每秒更改一次),将存储在 self._change 中并在标签中自动更新。但是这里 self._change 总是 empty 在哪里将标签绑定到变量? @stark bj0 的回答解决了我的问题。谢谢你:) 【参考方案1】:

您的代码存在一些问题。最大的是在您的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

另一种选择,因为您实际上只需要为整个应用保留一次时间,因此将属性放在您的应用类中并在 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

看起来更干净一些。

【讨论】:

以上是关于如何在kivy中制作自我更新时钟标签?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 中的数字时钟标签

如何在 Kivy、Python 中更新标签的文本

Python Kivy:self.ids 不更新标签文本

如何在 kivy python 中使用 size_hint 制作标签

如何在 Kivy 中动态更改标签背景颜色

Kivy:单击按钮时如何更新标签