टैब के विभिन्न 'पुनरावृत्तियों' के साथ KivyMD डायनेमिक टैब प्रबंधन
मैंने 'डायनेमिक टैब मैनेजमेंट' के बारे में 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 से डुप्लिकेट किया है:
जवाब
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>
।