如何在 Kivy、Python 中更新标签的文本
Posted
技术标签:
【中文标题】如何在 Kivy、Python 中更新标签的文本【英文标题】:How to update text of a label in Kivy, Python 【发布时间】:2018-10-06 07:18:29 【问题描述】:我在 Kivy 中制作了一个简单的计时器程序和一个带有标签和按钮的框布局。每当按下按钮时,我都希望计时器启动并且标签显示经过的时间。我遵循了本教程: https://www.youtube.com/watch?v=cggCobcS3vU 然后在代码中添加了一些我自己的东西,但标签只显示.kv文件中设置的初始文本。有什么办法吗?
timer.py
import time
from kivy.app import App
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import StringProperty, ObjectProperty
class MyApp(BoxLayout):
def __init__(self, **kwargs):
super(MyApp, self).__init__(**kwargs)
self.output = ''
def update_label(self):
self.lbl1.text = str(self.output)
def count(self, *varargs):
timeLoop = True
Sec = 0
Min = 0
Hrs = 0
while timeLoop == True:
self.update_label()
print(str(self.output))
Sec += 1
time.sleep(1)
if Sec == 60:
Sec = 0
Min += 1
if Min == 60:
Min = 0
Hrs += 1
if Sec <= 9 and Min <=9 and Hrs <= 9:
self.output = '0' + str(Hrs) +'.'+ '0' + str(Min) + "." + '0' + str(Sec)
elif Sec <= 9 and Min <=9 and Hrs >=9:
self.output = str(Hrs) + '.'+ '0' + str(Min) + "." + '0' + str(Sec)
elif Sec <= 9 and Min >=9 and Hrs >=9:
self.output = str(Hrs) + '.'+ str(Min) + "." + '0' + str(Sec)
elif Sec >= 9 and Min >=9 and Hrs >=9:
self.output = str(Hrs) + '.'+ str(Min) + "." + str(Sec)
elif Sec >= 9 and Min >=9 and Hrs <=9:
self.output = '0' + str(Hrs) +'.'+ str(Min) + "." + str(Sec)
elif Sec >= 9 and Min <= 9 and Hrs <=9:
self.output = '0' + str(Hrs) +'.'+ '0' + str(Min) + "." + str(Sec)
elif Sec >= 9 and Min <=9 and Hrs >= 9:
self.output = str(Hrs) +'.'+ '0' + str(Min) + "." + str(Sec)
elif Sec <= 9 and Min >= 9 and Hrs <=9:
self.output = '0' + str(Hrs) +'.'+ str(Min) + "." + '0' + str(Sec)
class MainApp(App):
def build(self):
c = MyApp()
return c
if __name__ == '__main__':
MainApp().run()
mainapp.kv
<MyApp>:
lbl1: label1
BoxLayout:
size: root.size
Button:
id: button1
text: "Change text"
on_press: root.count()
Label:
id: label1
text: "hi"
我知道这一点:How to change text of a label in the kivy language with python
还有这个:https://groups.google.com/forum/#!topic/kivy-users/mdqPQYBWEU8
但似乎都不适合我。
【问题讨论】:
【参考方案1】:像time.sleep()
这样的阻塞任务和一个无限循环不是GUI友好的,因为它存在于一个事件循环中,所以阻塞任务不允许处理其他事件,比如改变窗口大小、移动窗口等.
Kivy 可以在不使用 True 或 time.sleep()
的情况下创建周期性任务,因为使用了 Clock
:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
class MyApp(BoxLayout):
def __init__(self, **kwargs):
super(MyApp, self).__init__(**kwargs)
self.output = ''
def update_label(self):
self.lbl1.text = str(self.output)
def count(self, *varargs):
self.Sec = 0
self.Min = 0
self.Hrs = 0
Clock.schedule_interval(self.on_timeout, 1)
def on_timeout(self, *args):
self.update_label()
self.Sec += 1
if self.Sec == 60:
self.Sec = 0
self.Min += 1
if self.Min == 60:
self.Min = 0
self.Hrs += 1
if self.Sec <= 9 and self.Min <=9 and self.Hrs <= 9:
self.output = '0' + str(self.Hrs) +'.'+ '0' + str(self.Min) + "." + '0' + str(self.Sec)
elif self.Sec <= 9 and self.Min <=9 and self.Hrs >=9:
self.output = str(self.Hrs) + '.'+ '0' + str(self.Min) + "." + '0' + str(self.Sec)
elif self.Sec <= 9 and self.Min >=9 and self.Hrs >=9:
self.output = str(self.Hrs) + '.'+ str(self.Min) + "." + '0' + str(self.Sec)
elif self.Sec >= 9 and self.Min >=9 and self.Hrs >=9:
self.output = str(self.Hrs) + '.'+ str(self.Min) + "." + str(self.Sec)
elif self.Sec >= 9 and self.Min >=9 and self.Hrs <=9:
self.output = '0' + str(self.Hrs) +'.'+ str(self.Min) + "." + str(self.Sec)
elif self.Sec >= 9 and self.Min <= 9 and self.Hrs <=9:
self.output = '0' + str(self.Hrs) +'.'+ '0' + str(self.Min) + "." + str(self.Sec)
elif self.Sec >= 9 and self.Min <=9 and self.Hrs >= 9:
self.output = str(self.Hrs) +'.'+ '0' + str(self.Min) + "." + str(self.Sec)
elif self.Sec <= 9 and self.Min >= 9 and self.Hrs <=9:
self.output = '0' + str(self.Hrs) +'.'+ str(self.Min) + "." + '0' + str(self.Sec)
class MainApp(App):
def build(self):
c = MyApp()
return c
if __name__ == '__main__':
MainApp().run()
加:
我们可以使用库来减少时间,而不是进行繁琐的计算来获得时间:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from datetime import datetime
class MyApp(BoxLayout):
def count(self, *varargs):
self.start = datetime.now()
Clock.schedule_interval(self.on_timeout, 1)
def on_timeout(self, *args):
d = datetime.now() - self.start
self.lbl1.text = datetime.utcfromtimestamp(d.total_seconds()).strftime("%H.%M.%S")
class MainApp(App):
def build(self):
c = MyApp()
return c
if __name__ == '__main__':
MainApp().run()
【讨论】:
两种方法都有效,第二种方法是真正的节省时间。谢谢 为什么我有黑屏?)Kivy程序启动,但它什么也不做,只有黑屏)【参考方案2】:在您的 KV 文件中,id 是 label1,但是当您更新时,您正在更新 lbl1 的文本。
【讨论】:
以上是关于如何在 Kivy、Python 中更新标签的文本的主要内容,如果未能解决你的问题,请参考以下文章
在 Kivy for Python 中按下按钮时更新标签的文本