Farklı sekme 'yinelemeleri' ile KivyMD Dinamik Sekme Yönetimi

Aug 18 2020

KivyMD belgelerinden 'Dinamik Sekme Yönetimi' ile ilgili kodu kullandım, böylece kullanıcılar sekme ekleyebilir / silebilir. Bununla birlikte, oluşturulan bu sekmelerin her biri açıkça aynıdır ve bu nedenle, içine koyduğum pencere öğeleri de öyle. Bu, söz konusu widget'ın kimliğini örneğin Sekme 3'ten almaya çalışıyorsam , bunu yapmanın bir yolu olmadığı anlamına gelir, çünkü bu, örneğin Sekme 1'deki widget ile aynı kimliktir . İşte kod:

.py dosyası

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]
    )

.kv dosyası

<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()

MDTextField'deki girişin 'Hi' olduğu Sekme 1:

MDTextField'daki girişin Tab'den kopyalandığı Tab2:

Kullanıcıların yine de Sekmeler ekleyip silebilmeleri, ancak tüm widget'ların ( .kv dosyasındaki MDTextField gibi ) farklı kimliklere sahip olması ve böylece kullanıcı girdisine onlardan erişebilmem için yine de sahip olma var mı? Şimdiden teşekkür ederiz, eğer bu soru kötü yazılmışsa lütfen daha fazla bilgi isteyin!

Yanıtlar

1 JohnAnderson Aug 17 2020 at 23:51

idsSadece oluşturulan widget'lar için doldurulur kvkuralı. Bu nedenle Tab, .kvdosyanın dışında oluşturulanlar idssözlüğe girilmeyecektir. Ancak, yönteminizi idsdeğiştirerek bunları hackleyebilirsiniz add_tab():

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)

Bu new_id, idsiçindeki MDTabs.

Yapmak için MDTextFieldbir kısmını Tab, sadece eklemek <Tab>kuralı. Belki de bunun gibi:

<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()

Elbette , kuraldan MDTextField(ve ekini FloatLayout) kaldırırsınız <AddWorkouts>.