es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con la función sleep que se utiliza dentro de la función rotate. 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ón sleep 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 objeto Clock programa funciones para que se ejecuten en intervalos específicos, sin bloquear toda la aplicación. Así es como puedes modificar la clase MyApp para usar el objeto Clock:

    from kivy.clock import Clock
    
    class MyApp(MDApp):
    
        def build(self):
            Clock.schedule_interval(self.rotate, 0.01)
    
        def rotate(self, dt):
            screen = self.root.get_screen('mainscreen')
            if screen:
                screen.ids.spin.angle -= 1
    

    En esta versión modificada, la función rotate se programa para que se ejecute cada 0,01 segundos utilizando el método Clock.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.

Comments are closed.