Блокирующие задачи, такие как 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()