繁体   English   中英

如何使猕猴桃自我更新时钟标签?

[英]how to make self updating clock label in kivy?

我想制作一个充当时钟的标签,并每秒更新一次,就像在“ 创建一个时钟中的链接”中一样,但在状态栏中。

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

我有3个档案

  1. test_gui.py
  2. 测试文件
  3. 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'

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

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

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

第二个问题是您将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

看起来更干净一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM