KivyMD Dynamic Tab Management avec différentes "itérations" d'onglets
J'ai utilisé le code des documents KivyMD sur la "Gestion dynamique des onglets" afin que les utilisateurs puissent ajouter/supprimer des onglets. Cependant, chacun de ces onglets qui sont créés sont évidemment identiques et donc les widgets que j'y mets le sont aussi. Cela signifie que si j'essaie de prendre l'identifiant dudit widget à partir , par exemple, de l'onglet 3 , il n'y a aucun moyen de le faire car il s'agit du même identifiant que le widget dans, par exemple, l'onglet 1 . Voici le code :
fichier .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]
)
fichier .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()
Onglet 1, où l'entrée dans MDTextField est 'Hi' :
Tab2, où l'entrée dans MDTextField a été dupliquée à partir de Tab :
Réponses
Les ids
ne sont renseignés que pour les widgets créés dans une kv
règle. Ainsi, tout fichier Tab
créé en dehors du .kv
fichier ne sera pas entré dans le ids
dictionnaire. Cependant, vous pouvez les pirater en ids
modifiant votre add_tab()
méthode :
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)
Cela ajoute le new_id
au ids
dans le MDTabs
.
Pour faire la MDTextField
partie du Tab
, il suffit de l'ajouter à la <Tab>
règle. Peut-être comme ça :
<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()
Bien sûr, vous supprimeriez le MDTextField
(et son encadrement FloatLayout
) de la <AddWorkouts>
règle.