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.

¿Por qué el evento on_touch_down de KivyMD está activando múltiples elementos?

Tengo una pantalla en mi aplicación KivyMD con una lista de elementos. Mi objetivo es navegar a diferentes pantallas dependiendo del elemento seleccionado. Me di cuenta de que no importa qué elemento elija, la siguiente pantalla estaría o no relacionada con el elemento seleccionado. Parece aleatorio.

A continuación se muestra un ejemplo reproducible. Para simplificar, eliminé la mayoría de los elementos y reemplacé la navegación con una función de impresión simple.

Cuando hago clic en un elemento o en el botón “cancelar”, se imprimen varios textos como si hubiera hecho clic en más de 1 elemento de la pantalla (por ejemplo, hacer clic en el elemento 1 da como resultado la impresión de “elemento3 elemento2 elemento1”). Sospecho que es por eso que la navegación no era consistente.

Encuentro esto confuso. ¿Alguien podría explicarme qué está pasando aquí? Gracias 🙂

from kivy.lang import Builder
from kivymd.app import MDApp

KV = '''
MDScreen:
    name: "screen1"
    MDBoxLayout:
        orientation: "vertical"
        MDToolbar:
            id: tb_screen1
            title: "Seleccionar ítem"
            on_touch_down:
                app.p(self.title)
        ScrollView:
            MDList:
                OneLineListItem:
                    text: "item1"
                    on_touch_down:
                        app.p(self.text)

                OneLineListItem:
                    text: "item2"
                    on_touch_down:
                        app.p(self.text)

                OneLineListItem:
                    text: "item3"
                    on_touch_down:
                        app.p(self.text)


    MDBoxLayout:
        MDFloatLayout:                           
            MDRectangleFlatIconButton:
                text: "Cancelar"
                on_press:
                    app.p(self.text)

'''

class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)


    def p(self,text):
        print(text)

MainApp().run()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el evento on_touch_down se activa tanto para el OneLineListItem como para el MDToolbar, lo cual provoca que se impriman textos múltiples. Para solucionarlo, puedes cambiar el evento a on_release para el OneLineListItem y quitar el evento del MDToolbar.

    Código actualizado:

    from kivy.lang import Builder
    from kivymd.app import MDApp
    
    KV = '''
    MDScreen:
        name: "screen1"
        MDBoxLayout:
            orientation: "vertical"
            MDToolbar:
                id: tb_screen1
                title: "Seleccionar ítem"
            ScrollView:
                MDList:
                    OneLineListItem:
                        text: "ítem1"
                        on_release:
                            app.p(self.text)
    
                    OneLineListItem:
                        text: "ítem2"
                        on_release:
                            app.p(self.text)
    
                    OneLineListItem:
                        text: "ítem3"
                        on_release:
                            app.p(self.text)
    
    
            MDBoxLayout:
                MDFloatLayout:
                    MDRectangleFlatIconButton:
                        text: "Cancelar"
                        on_press:
                            app.p(self.text)
    
    '''
    
    class MainApp(MDApp):
        def build(self):
            return Builder.load_string(KV)
    
        def p(self, text):
            print(text)
    
    MainApp().run()
    

    En este código actualizado, el evento on_release solo se activará cuando se suelte el OneLineListItem, lo cual debería solucionar el problema de imprimir textos múltiples.

Comments are closed.