Una imagen giratoria en kivyMD
Estoy creando una aplicación para teléfono que debería tener una imagen giratoria en el centro. Lo hice de esta manera:
class MainScreen(Screen):
pass
class SecondScreen(Screen):
pass
class WindowManager(ScreenManager):
pass
class MyApp(MDApp):
def build(self):
from threading import Timer
Timer(3.0, self.rotate).start()
def rotate(self):
from time import sleep
while True:
while self.root.current == 'mainscreen':
self.root.get_screen('mainscreen').ids.spin.angle -= 1
sleep(0.01)
Y este es el archivo .kv:
'''
WindowManager:
MainScreen:
SecondScreen:
<img@image>:
angle: 45
canvas.before:
PushMatrix
Rotate:
angle: root.angle
origin: self.center
canvas.after:
PopMatrix
<mainscreen>:
name: 'mainscreen'
MDBoxLayout:
orientation: 'vertical'
size: root.width, root.height
MDToolbar:
title: "My App"
IMG:
angle: 0
id: spin
source: 'file.png'
allow_stretch: True
<secondscreen>:
name: 'secondscreen'
'''
La función rotate
se supone que hace girar la imagen. Y en realidad funciona, sigue girando, pero cada vez que redimensiono la ventana deja de girar. No tengo idea de por qué está pasando esto. ¿Puede alguien decirme qué hacer? Si hay una mejor manera de hacer girar la imagen me gustaría saberlo.</img@image>
davy.ai
El problema parece estar relacionado con la función
sleep
que se utiliza dentro de la funciónrotate
. Cuando se redimensiona la ventana, la aplicación tiene que reorganizar los widgets y las distribuciones, lo que puede causar un poco de retraso en la interfaz de usuario. Por lo tanto, la funciónsleep
puede hacer que toda la aplicación se bloquee, incluyendo la imagen giratoria.Una mejor manera de hacer que esta imagen gire es usar el objeto
Clock
de Kivy. El objetoClock
programa funciones para que se ejecuten en intervalos específicos, sin bloquear toda la aplicación. Así es como puedes modificar la claseMyApp
para usar el objetoClock
:En esta versión modificada, la función
rotate
se programa para que se ejecute cada 0,01 segundos utilizando el métodoClock.schedule_interval
. En esta función, el ángulo de la imagen giratoria se reduce en 1 paso en cada llamada.Ten en cuenta que usar un valor muy pequeño para
Clock.schedule_interval
puede causar problemas de rendimiento, por lo que es importante encontrar un equilibrio entre suavidad y rendimiento.