Python 使用*.kv文件每5秒调用一次API
我试图在*.kv文件中每隔5秒调用一个方法,我在网上发现了许多使用*.py文件的示例,但不幸的是,甚至没有一个使用*.kv文件。请帮我做这个 *.kv文件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中标签的属
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