如何在Kivy,Python中更新标签的文本

时间:2018-04-25 17:59:00

标签: python timer label kivy updating

我在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

但似乎两者似乎都不适合我。

2 个答案:

答案 0 :(得分:0)

阻止诸如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()  

答案 1 :(得分:0)

在您的KV文件中,id为label1,但是在更新时,您正在更新lbl1的文本。