タブの「反復」が異なるKivyMD動的タブ管理
Aug 18 2020
ユーザーがタブを追加/削除できるように、「動的タブ管理」に関するKivyMDドキュメントのコードを使用しました。ただし、作成されるこれらのタブはそれぞれ明らかに同一であるため、そこに配置するウィジェットも同じです。これは、たとえばタブ3から上記のウィジェットのIDを取得しようとしている場合、たとえばタブ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()
タブ1、MDTextFieldの入力は「Hi」です。

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>
。