टैब के विभिन्न 'पुनरावृत्तियों' के साथ KivyMD डायनेमिक टैब प्रबंधन

Aug 18 2020

मैंने 'डायनेमिक टैब मैनेजमेंट' के बारे में KivyMD दस्तावेज़ों से कोड का उपयोग किया है ताकि उपयोगकर्ता टैब जोड़ / हटा सकें। हालाँकि, इनमें से प्रत्येक टैब जो बनाए गए हैं, वे स्पष्ट रूप से समान हैं और इसलिए जो विगेट्स मैंने इसमें डाले हैं, वे भी हैं। इसका मतलब यह है कि अगर मैं उदाहरण के लिए टैब 3 से उक्त विजेट की आईडी लेने की कोशिश कर रहा हूं , तो ऐसा करने का कोई तरीका नहीं है क्योंकि यह उसी तरह का है जैसे कि टैब 1 में विजेट । यहाँ कोड है:

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

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

टैब 1, जहां MDTextField में इनपुट 'Hi' है:

Tab2, जहां MDTextField में इनपुट ने Tab से डुप्लिकेट किया है:

क्या अभी भी उपयोगकर्ताओं के टैब्स को जोड़ने और हटाने में सक्षम होने के बावजूद, लेकिन इसे सभी विजेट (जैसे MDTextField .kv फ़ाइल में) में अलग-अलग आईडी हैं ताकि मैं उनसे उपयोगकर्ता इनपुट प्राप्त कर सकूं? अग्रिम धन्यवाद, अगर यह प्रश्न बुरी तरह से लिखा गया है तो कृपया किसी भी अधिक जानकारी के लिए पूछें!

जवाब

1 JohnAnderson Aug 17 2020 at 23:51

idsकेवल एक में बनाया विगेट्स भर जाती है kvनियम। तो फ़ाइल Tabके बाहर निर्मित कोई भी शब्दकोश .kvमें दर्ज नहीं किया जाएगा ids। हालाँकि, आप idsअपनी 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)

यह कहते हैं new_idकरने के लिए idsमें MDTabs

का MDTextFieldहिस्सा बनाने के लिए Tab, इसे <Tab>नियम में जोड़ें । शायद इस तरह:

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

बेशक, आप नियम से MDTextField(और इसके संलग्नक FloatLayout) को हटा देंगे <AddWorkouts>