【问题标题】:Call API every 5 seconds using *.kv file使用 *.kv 文件每 5 秒调用一次 API
【发布时间】:2019-10-02 14:08:46
【问题描述】:

我试图在 *.kv 文件中每 5 秒调用一次方法,我在网上找到了许多使用 *.py 文件的示例,但不幸的是,甚至没有一个使用 *.kv 文件的示例。请帮我解决这个问题。

*.kv 文件

 Label:
            id:time
            text: root.display_time()
            font_size:40
            size:[300,50]

*.py 文件(方法)

 def display_time(self):
        return ddt.get_time()

【问题讨论】:

  • 也许你找不到 .kv 的例子,因为你可能不能只用 .kv 做这个,你必须运行 ie。 Clock.schedule_interval 运行会定期更新的函数。
  • @furas 他在 .kv 中找不到示例,因为这是不寻常的事情。在 .kv 中,冒号右边是 python,所以你可以在里面放 python 代码。我不确定为什么 OP 想要在 .kv 中完成。我会将Clock 函数放在父规则的__init__ 中并更新StringProperty()。
  • @AndreiSima 虽然下面提到的解决方案对我有用,但我仍然想知道如何使用父规则的 init 中的“时钟功能”和更新 StringProperty()'
  • @ShamimAhmad 是的,该解决方案正在发挥作用,这正是您所要求的。我只说走这条路很奇怪。就代码的可读性和理解而言,您想要实现的目标并不那么清楚。此外,您在 OP 中想要的方式可能不是防弹的,因为所有 UI 更新都必须在 @mainthread you cannot do any OpenGL-related work in a thread 中完成。只是为了确保我用@mainthread 装饰器装饰任何可能在另一个线程中执行的函数。发表了您在之前的评论中提出的问题。享受吧。

标签: python kivy kivy-language


【解决方案1】:

您可以通过将Clock.schedule_interval() 分配给kv 中Label 的属性来做到这一点:

#: 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_interval() 调用。

【讨论】:

    【解决方案2】:

    根据 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()
    

    main.kv

    <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
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多