Kivy-定期更新标签文本

时间:2019-05-09 19:16:02

标签: python kivy

python和kivy的新手。在仪表板上工作以显示时间和其他参数。当前已设置仪表板,并完美显示所有值。但是仍然无法弄清楚如何在那些用于时间的标签中动态更新时间。发现了类似的帖子,但仍在挣扎。在我的代码的摘要部分下面发布。

与Clock对象一起使用,每隔一秒触发一个方法,该方法需要更新kv文件中的标签文本。但是无法将这种逻辑付诸实践。

sample.py

import time
import datetime
import kivy
kivy.require('1.11.0')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.text import LabelBase
from kivy.clock import Clock

class MySec(BoxLayout):
    seconds_string = time.strftime("%S")

class MyApp(App):
    def build(self):
        #Clock.schedule_interval('periodic_method', 1)
        return MySec()

if __name__ == '__main__':
    MyApp().run()

my.kv文件

<mysec>:
    orientation: 'vertical'
    Label:
        id: kv_sec
        text: root.seconds_string
        font_size: 200

简而言之,我应该如何修改.py文件,以便我的.kv标签文本每秒都使用更新后的值进行更新。提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用Kivy StringProperty自动更新Label的文本,并使用Kivy Clock对象,例如Clock.schedule_interval()以在每个时间间隔更新StringProperty

  • 用类型为seconds_string = time.strftime("%S")StringProperty的类属性替换seconds_string = StringProperty('')
  • 实施方法update_time()以更新类属性seconds_string
  • 使用Kivy Clock.schedule_interval()调用方法update_time()

Kivy » Introduction to Properties

  

属性是定义事件并将其绑定的一种很棒的方法。   本质上,它们会产生事件,例如当您的   对象更改,所有引用该属性的属性都是   自动更新。

示例

以下示例使用time()函数提取时间。可以用datetime.now()代替,例如将time.strftime("%S")替换为datetime.now().strftime("%S"),然后添加导入语句from datetime import datetime

main.py

import time
import kivy

kivy.require('1.11.0')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty


Builder.load_string("""
<MySec>:
    orientation: 'vertical'
    Label:
        id: kv_sec
        text: root.seconds_string
        font_size: 200
""")


class MySec(BoxLayout):
    seconds_string = StringProperty('')


class MyApp(App):
    def build(self):
        Clock.schedule_interval(lambda dt: self.update_time(), 1)
        return MySec()

    def update_time(self):
        self.root.seconds_string = time.strftime("%S")


if __name__ == '__main__':
    MyApp().run()

输出

Result