В графическом интерфейсе не следует использовать sleep()
, это задача, которая блокирует цикл обработки событий, каждый графический интерфейс пользователя предлагает инструменты для создания того же эффекта удобным для пользователя способом, в случае tkinter after()
(так избегайте использования sleep()
с update()
(это плохая практика), в случае kivy вы можете использовать Clock
:
import kivy
from kivy.app import App
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.config import Config
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '100')
Config.write()
Window.size = (300, 100)
class ButtonAnimation(Button):
def __init__(self, **kwargs):
Button.__init__(self, **kwargs)
self.bind(on_press=self.start_animation)
def start_animation(self, *args):
self.counter = 100
self.clock = Clock.schedule_interval(self.animation, 0.01)
def animation(self, *args):
Window.size = (300, self.counter)
self.counter += 1
if self.counter > 400:
self.clock.cancel()
class MyApp(App):
def build(self):
root = ButtonAnimation(text='Press me')
return root
if __name__ == '__main__':
MyApp().run()
или лучше, используя Animation
, преимущество этой реализации помимо наличия более читабельного кода заключается в том, что kivy обрабатывает, когда он должен обновляться таким образом, что он не потребляет ресурсы без необходимости:
import kivy
from kivy.app import App
from kivy.core.window import Window
from kivy.animation import Animation
from kivy.uix.button import Button
from kivy.config import Config
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '100')
Config.write()
Window.size = (300, 100)
class ButtonAnimation(Button):
def __init__(self, **kwargs):
Button.__init__(self, **kwargs)
self.bind(on_press=self.start_animation)
def start_animation(self, *args):
anim = Animation(size=(300, 400), step=0.01)
anim.start(Window)
class MyApp(App):
def build(self):
root = ButtonAnimation(text='Press me')
return root
if __name__ == '__main__':
MyApp().run()