Gestión dinámica de pestañas de KivyMD con diferentes 'iteraciones' de pestañas

Aug 18 2020

He usado el código de los documentos de KivyMD sobre 'Gestión dinámica de pestañas' para que los usuarios puedan agregar/eliminar pestañas. Sin embargo, cada una de estas pestañas que se crean son obviamente idénticas y, por lo tanto, los widgets que puse en ella también lo son. Esto significa que si estoy tratando de tomar la identificación de dicho widget de , por ejemplo, la pestaña 3 , no hay forma de hacerlo, ya que es la misma identificación que el widget en, por ejemplo, la pestaña 1 . Aquí está el código:

archivo .py

def on_start(self):
    self.add_tab()

def get_tab_list(self):
    print(self.root.ids.addworkouts.ids.tabs.get_tab_list())

def add_tab(self):
    self.index += 1
    self.root.ids.addworkouts.ids.tabs.add_widget(Tab(text=f"Exercise {self.index}"))

def remove_tab(self):
    self.index -= 1
    self.root.ids.addworkouts.ids.tabs.remove_widget(
        self.root.ids.addworkouts.ids.tabs.get_tab_list()[0]
    )

archivo .kv

<AddWorkouts>
name: 'AddWorkouts'
tabs: tabs

BoxLayout:
    orientation: 'vertical'

    MDToolbar:
        title: ' '#app.getWorkoutName()
        type: 'top'
        left_action_items: [['keyboard-backspace', lambda x: app.goBacktoMyWorkouts()]]
        #md_bg_color: app.theme_cls.accent_color
        elevation: 10


    FloatLayout:
        canvas:
            Color:
                rgba: 0, 0, 0.5, 0.9
            Rectangle:
                pos: self.pos
                size: self.size

        MDTabs:
            id: tabs

        FloatLayout:
            canvas:
                Color:
                    rgba: 1, 1, 1, 1
                Rectangle:
                    size: self.size
                    pos: self.pos

            pos_hint: {'center_x': 0.5, 'y': 0.1}
            size_hint: 0.8, 0.6


            MDTextField:
                pos_hint: {'x': 0.05, 'y': 0.8}
                size_hint: 0.6, None
                hint_text: 'Exercise Name'
                helper_text_mode: 'on_focus'
                required: 'True'
                multiline: False


<Tab>

    MDList:

        MDBoxLayout:
            adaptive_height: True
            md_bg_color: 1, 1, 1, 1

            MDFlatButton:
                text: "ADD EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.add_tab()

            MDFlatButton:
                text: "REMOVE LAST EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.remove_tab()

Pestaña 1, donde la entrada en MDTextField es 'Hola':

Tab2, donde la entrada en MDTextField se ha duplicado desde Tab:

¿Hay alguna forma de que los usuarios aún puedan agregar y eliminar pestañas, pero que todos los widgets (como MDTextField en el archivo .kv) tengan ID diferentes para que pueda acceder a la entrada del usuario desde ellos? Gracias de antemano, si esta pregunta se ha redactado mal, ¡solo solicite más información!

Respuestas

1 JohnAnderson Aug 17 2020 at 23:51

Solo se completan para los idswidgets creados en una kvregla. Por lo tanto, cualquier Tabcreado fuera del .kvarchivo no se ingresará en el idsdiccionario. Sin embargo, puede piratearlos idsmodificando su add_tab()método:

import weakref
def add_tab(self):
    self.index += 1
    new_tab = Tab(text=f"Exercise {self.index}")
    new_id = 'tab_' + str(self.index)
    self.root.ids.addworkouts.ids.tabs.add_widget(new_tab)
    self.root.ids.addworkouts.ids.tabs.ids[new_id] = weakref.ref(new_tab)

Esto agrega el new_idal idsen el MDTabs.

Para hacer la MDTextFieldparte de Tab, solo agréguela a la <Tab>regla. Tal vez así:

<Tab>
    MDList:
        MDTextField:
            size_hint: 0.6, None
            hint_text: 'Exercise Name'
            helper_text_mode: 'on_focus'
            required: 'True'
            multiline: False

        MDBoxLayout:
            adaptive_height: True
            md_bg_color: 1, 1, 1, 1

            MDFlatButton:
                text: "ADD EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.add_tab()

            MDFlatButton:
                text: "REMOVE LAST EXERCISE"
                text_color: 16/255, 167/255, 249/255, 1
                on_release: app.remove_tab()

Por supuesto, eliminaría MDTextField(y el FloatLayout) adjunto de la <AddWorkouts>regla.