Python 使用*.kv文件每5秒调用一次API

Python 使用*.kv文件每5秒调用一次API,python,kivy,kivy-language,Python,Kivy,Kivy Language,我试图在*.kv文件中每隔5秒调用一个方法,我在网上发现了许多使用*.py文件的示例,但不幸的是,甚至没有一个使用*.kv文件。请帮我做这个 *.kv文件 Label: id:time text: root.display_time() font_size:40 size:[300,50] *.py文件(方法) 您可以通过将Clock.schedule\u interval()指定给kv中标签的属

我试图在*.kv文件中每隔5秒调用一个方法,我在网上发现了许多使用*.py文件的示例,但不幸的是,甚至没有一个使用*.kv文件。请帮我做这个

*.kv文件

 Label:
            id:time
            text: root.display_time()
            font_size:40
            size:[300,50]
*.py文件(方法)


您可以通过将
Clock.schedule\u interval()
指定给
kv
标签的属性来完成此操作:

#: import Clock kivy.clock.Clock
#: import ddt datetime.datetime
Label:
    abba: Clock.schedule_interval(lambda dt: setattr(self, 'text', str(ddt.now())), 5)

abba
属性除了启动
Clock.schedule\u interval()
调用外,没有任何效果

根据Shamim Ahmad对OPost评论的请求:

请参见从python更改kivy属性的示例

您可以看到,第三个标签的所有属性都是从python端设置的。 在本例中,我尝试混合使用多个属性,以说明如何从python端与UI交互。您可以将此示例扩展到其他Kivy属性

main.py

from datetime import datetime
import random

from kivy.app import App
from kivy.clock import Clock, mainthread
from kivy.graphics import Rectangle, Color
from kivy.properties import (
    ListProperty,
    ObjectProperty,
    StringProperty,
)
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

from kivy.config import Config
Config.set('graphics', 'position', 'custom')
Config.set('graphics', 'left', 0)
Config.set('graphics', 'top', 0)

Builder.load_file('main.kv')


class MainLayout (BoxLayout):

    label1_text = StringProperty('Initial Text')
    label2_text = StringProperty()
    label2_color = ListProperty([1, .5, 0, 1])

    my_object_label = ObjectProperty()

    def __init__(self, **kwargs):
        super(MainLayout, self).__init__(**kwargs)
        Clock.schedule_interval(self.update_my_lbls, 5)
        self.refference_time = datetime.now()
        self.label1_text = datetime.now().strftime('%H:%M:%S')

        self.my_object_label.markup = True
        self.my_object_label.text = '[b]Object Label[/b]'
        self.my_object_label.color = self.random_color()
        self.my_object_label.font_size = '30sp'

    @mainthread
    def update_my_lbls(self, dt):
        self.label1_text = datetime.now().strftime('%H:%M:%S')
        time_delta = (datetime.now() - self.refference_time).seconds
        if (time_delta % 2 == 0):
            self.label2_color = [0, 1, .2, 1]
            self.label2_text = f'[b]{str(time_delta)} even [/b]'
        else:
            self.label2_color = [.2, .5, 1, 1]
            self.label2_text = f'[b]{str(time_delta)} odd[/b]'
        self.my_object_label.color = self.random_color()

    def random_color(self):
        r, g, b, a = [random.uniform(0, 1) for _ in range(4)]
        return ([r, g, b, a])


class MyApp (App):

    def build(self):
        return MainLayout()


if __name__ == '__main__':
    MyApp().run()
主电压(千伏)

<MainLayout>:
    my_object_label: my_object_label
    orientation: 'vertical'
    padding: 10
    canvas.before:
        Color: 
            rgba: (.1, .1, .1, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        font_size: '30sp'
        text: root.label1_text
        color: (0, .5, .8, 1)
    Label:
        font_size: '30sp'
        markup: True
        text: '[b]Time Delta[/b]'
        color: root.label2_color
    Label:
        id: my_object_label
:
我的对象标签:我的对象标签
方向:“垂直”
填充:10
在以下情况之前:
颜色:
rgba:(.1,1,1,1)
矩形:
pos:self.pos
大小:self.size
标签:
字体大小:“30sp”
text:root.label1\u text
颜色:(0.5.8.1)
标签:
字体大小:“30sp”
标记:正确
文本:“[b]时间增量[/b]”
颜色:root.label2\u颜色
标签:
id:我的\u对象\u标签

可能您找不到.kv的示例,因为您可能无法仅使用.kv执行此操作,而您必须运行ie。
时钟。计划\u interval
以运行函数,该函数将定期更新它。@furas他无法在.kv中找到示例,因为这样做是不寻常的。在.kv中,冒号的右侧是python,因此可以将python代码放在其中。我不知道OP为什么要在.kv中完成。我会将
Clock
函数放在父规则的
\uuuuu init\uuuuu
中,并更新
StringProperty()
@anderisima虽然下面提到的解决方案对我有效,但我仍然想知道如何使用父规则的“Clock function in init”和更新StringProperty()做同样的事情“@ShamimAhmad是的,解决方案正在发挥作用,这正是您所要求的。我只是说走这条路很奇怪。在代码可读性和理解性方面,您想要实现的目标还不太清楚。此外,您希望在OP中使用的方式可能不是防弹的,因为所有UI更新都必须在
@mainthread
中完成。您不能在线程中执行任何与OpenGL相关的工作。为了确保我用
@mainthread
decorator修饰了可能怀疑在另一个线程中执行的任何函数。发布了您在之前的评论中提出的问题。享受
<MainLayout>:
    my_object_label: my_object_label
    orientation: 'vertical'
    padding: 10
    canvas.before:
        Color: 
            rgba: (.1, .1, .1, 1)
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        font_size: '30sp'
        text: root.label1_text
        color: (0, .5, .8, 1)
    Label:
        font_size: '30sp'
        markup: True
        text: '[b]Time Delta[/b]'
        color: root.label2_color
    Label:
        id: my_object_label