如何在 kivy 中制作自我更新的时钟标签?
how to make self updating clock label in kivy?
我想制作一个标签,它充当时钟并每秒更新一次,就像在 making-a-clock-in-kivy link 中一样,但在状态栏中。
我希望 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'
您的代码存在一些问题。最大的在你的 build(self)
函数中:
def build(self):
self.load_kv('test.kv')
crudeclock = Status()
Clock.schedule_interval(crudeclock.update, 1)
return C()
您正在创建一个 Status
对象并设置一个时钟来调用它的更新函数,但它 不是 显示的一部分。它是 Status
的一个单独的独立实例,未附加到您的小部件树。当您 return C()
时,它会使用自己的内部 Status
实例创建 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
另一种选择,因为你真的只需要为你的整个应用程序保留一次时间,就是将 属性 放在你的应用程序 class 中,并且在 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
看起来干净一点。
我想制作一个标签,它充当时钟并每秒更新一次,就像在 making-a-clock-in-kivy link 中一样,但在状态栏中。
我希望 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'
您的代码存在一些问题。最大的在你的 build(self)
函数中:
def build(self):
self.load_kv('test.kv')
crudeclock = Status()
Clock.schedule_interval(crudeclock.update, 1)
return C()
您正在创建一个 Status
对象并设置一个时钟来调用它的更新函数,但它 不是 显示的一部分。它是 Status
的一个单独的独立实例,未附加到您的小部件树。当您 return C()
时,它会使用自己的内部 Status
实例创建 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
另一种选择,因为你真的只需要为你的整个应用程序保留一次时间,就是将 属性 放在你的应用程序 class 中,并且在 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
看起来干净一点。