KivyMD Dynamic Tab Management ที่มี 'การวนซ้ำ' ของแท็บที่แตกต่างกัน
ฉันใช้รหัสจากเอกสาร KivyMD เกี่ยวกับ 'การจัดการแท็บแบบไดนามิก' เพื่อให้ผู้ใช้สามารถเพิ่ม / ลบแท็บได้ อย่างไรก็ตามแต่ละแท็บที่สร้างขึ้นนั้นมีความเหมือนกันอย่างเห็นได้ชัดดังนั้นวิดเจ็ตที่ฉันใส่ไว้ก็เช่นกัน ซึ่งหมายความว่าถ้าฉันพยายามที่จะใช้ ID ของวิดเจ็ตกล่าวว่าจากเช่นแท็บ 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>
กฎ