Как обновить текст метки в Kivy, Python - PullRequest
0 голосов
/ 25 апреля 2018

Я сделал простую программу таймера и макет коробки с меткой и кнопкой в ​​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"

Мне известно об этом: Как изменить текст метки на языке kivy с помощью python

и это: https://groups.google.com/forum/#!topic/kivy-users/mdqPQYBWEU8

Но ни один из них, похоже, не работает для меня.

1 Ответ

0 голосов
/ 25 апреля 2018

Блокирующие задачи, такие как time.sleep() вместе с бесконечным циклом, не дружественны к графическому интерфейсу, поскольку они живут в цикле событий, поэтому задачи блокировки не позволят обрабатывать другие события, такие как изменение размера окна, перемещение окна и т. Д..

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

Plus:

Вместо того, чтобы делать утомительные вычисления, чтобы получить время, мы можем сократить его, используя библиотеки:

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()  
...