탭의 '반복'이 다른 KivyMD 동적 탭 관리
Aug 18 2020
사용자가 탭을 추가 / 삭제할 수 있도록 '동적 탭 관리'에 대한 KivyMD 문서의 코드를 사용했습니다. 그러나 생성 된 각 탭은 분명히 동일하므로 여기에 넣은 위젯도 마찬가지입니다. 이것은 예 를 들어 Tab 3 에서 해당 위젯의 ID 를 가져 오려고하면 예를 들어 Tab 1 의 위젯 과 동일한 ID 이므로 그렇게 할 수있는 방법이 없습니다 . 다음은 코드입니다.
.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()
MDTextField의 입력이 'Hi'인 탭 1 :

Tab2, MDTextField의 입력이 Tab에서 복제되었습니다.

답변
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>
.