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.

KIVY: Rotar todo el diseño

Me gustaría preguntar si es posible rotar todo el diseño en Kivy (incluyendo su funcionalidad).

Necesito diseñar un único diseño, pero necesito crear una aplicación con pantalla dividida horizontalmente y utilizar ese diseño normalmente en la parte inferior, pero en la parte superior rotarlo en 180° (al revés)…

El problema es que, aunque se ve bien, la funcionalidad en la parte superior (que está al revés) sigue estando normal (en este caso: cuando hago clic en el “Botón 2”, el “Botón 1” se hace clic y viceversa, eso está mal… 😓)

Mi código para Kivy es el siguiente:

BoxLayout:
    orientation: "vertical"

BoxLayout:
    canvas.before:
        PushMatrix
        Rotate:
            angle: 180
            origin: self.center
    canvas.after:
        PopMatrix
    Test:

<test@boxlayout>:
    Button:
        text: "Botón 1"
    Button:
        text: "Botón 2"

Por favor, ¿alguien podría darme algún consejo sobre cómo solucionarlo?

Muchas gracias. 😊</test@boxlayout>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible rotar todo un diseño en Kivy, incluyendo su funcionalidad. Sin embargo, el problema con la funcionalidad invertida puede ocurrir si el código no se modifica adecuadamente.

    Para resolver este problema, puedes modificar las instrucciones del lienzo para el diseño superior y revertir las coordenadas táctiles. Esto se debe a que las coordenadas táctiles también se invierten cuando se rota el diseño.

    Aquí tienes el código modificado para lograr el resultado deseado:

    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.graphics import PushMatrix, PopMatrix, Rotate, Callback
    
    class UpsideDownBoxLayout(BoxLayout):
        def __init__(self, **kwargs):
            super(UpsideDownBoxLayout, self).__init__(**kwargs)
    
            # Diseño de caja superior con rotación
            top_layout = BoxLayout(orientation='vertical')
            with top_layout.canvas.before:
                Callback(self.reverse_touch)
                PushMatrix()
                Rotate(angle=180, origin=self.center)
    
            with top_layout.canvas.after:
                PopMatrix()
    
            top_layout.add_widget(Button(text='Botón 1', size_hint_y=0.5))
            top_layout.add_widget(Button(text='Botón 2', size_hint_y=0.5))
            self.add_widget(top_layout)
    
            # Diseño de caja inferior
            bottom_layout = BoxLayout(orientation='vertical')
            bottom_layout.add_widget(Button(text='Botón 3', size_hint_y=0.5))
            bottom_layout.add_widget(Button(text='Botón 4', size_hint_y=0.5))
            self.add_widget(bottom_layout)
    
        def reverse_touch(self, *args):
            # Invertir las coordenadas táctiles para que coincidan con la orientación del diseño superior
            self.transform_touch(*args)
            self.to_parent(*args)
            self.canvas.ask_update()
    
        def transform_touch(self, touch):
            touch.apply_transform_2d(lambda x, y: (x, self.height - y))
    
    # Crear la aplicación
    from kivy.app import App
    
    class UpsideDownApp(App):
        def build(self):
            return UpsideDownBoxLayout()
    
    if __name__ == '__main__':
        UpsideDownApp().run()
    

    En el código modificado, se crea una clase personalizada UpsideDownBoxLayout que contiene dos BoxLayouts: top_layout y bottom_layout. Las instrucciones del lienzo para top_layout se modifican para incluir una función de devolución de llamada que invierte las coordenadas táctiles antes de pasarlas al diseño. Se define la función reverse_touch con este propósito. Las coordenadas táctiles también se transforman utilizando la función transform_touch para que sean coherentes con la orientación del diseño.

    Espero que esto ayude. Déjame saber si tienes alguna pregunta adicional.

Comments are closed.