Farklı sekme 'yinelemeleri' ile KivyMD Dinamik Sekme Yönetimi
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:

Yanıtlar
ids
Sadece oluşturulan widget'lar için doldurulur kv
kuralı. Bu nedenle Tab
, .kv
dosyanın dışında oluşturulanlar ids
sözlüğe girilmeyecektir. Ancak, yönteminizi ids
değ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
, ids
içindeki MDTabs
.
Yapmak için MDTextField
bir 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>
.