如何在 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()  

ma​​inapp.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 中更新标签的文本的主要内容,如果未能解决你的问题,请参考以下文章

Python Kivy:self.ids 不更新标签文本

在 Kivy for Python 中按下按钮时更新标签的文本

在 Kivy for Python 中按下按钮时更新标签的文本

Kivy 标签文本未更新 - 仅在方法的最后一次更改时更新

Kivy 更新动态标签文本

Kivy:如何在不关闭弹出窗口的情况下更新弹出标签文本