具有不同 'iterations' 个选项卡的 KivyMD 动态选项卡管理
KivyMD Dynamic Tab Management with different 'iterations' of tabs
我使用了 KivyMD 文档中有关 'Dynamic Tab Management' 的代码,因此用户可以添加/删除选项卡。但是,创建的这些选项卡中的每一个显然都是相同的,因此我放入其中的小部件也是如此。这意味着如果我试图从 例如选项卡 3 中获取所述小部件的 ID,则没有办法这样做,因为它是 相同的 ID 作为 例如选项卡 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 重复:
无论如何仍然让用户能够添加和删除选项卡,但是让所有的小部件(比如 .kv 文件中的 MDTextField)有不同的 ID,所以我可以访问他们的用户输入?在此先感谢您,如果这个问题措辞不当,请询问更多信息!
ids
仅针对在 kv
规则中创建的小部件进行填充。因此,在 .kv
文件之外创建的任何 Tab
都不会输入到 ids
字典中。但是,您可以通过修改 add_tab()
方法将它们黑入 ids
:
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
添加到 MDTabs
中的 ids
。
要使 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()
当然,您可以从 <AddWorkouts>
规则中删除 MDTextField
(及其封闭的 FloatLayout
)。
我使用了 KivyMD 文档中有关 'Dynamic Tab Management' 的代码,因此用户可以添加/删除选项卡。但是,创建的这些选项卡中的每一个显然都是相同的,因此我放入其中的小部件也是如此。这意味着如果我试图从 例如选项卡 3 中获取所述小部件的 ID,则没有办法这样做,因为它是 相同的 ID 作为 例如选项卡 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
规则中创建的小部件进行填充。因此,在 .kv
文件之外创建的任何 Tab
都不会输入到 ids
字典中。但是,您可以通过修改 add_tab()
方法将它们黑入 ids
:
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
添加到 MDTabs
中的 ids
。
要使 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()
当然,您可以从 <AddWorkouts>
规则中删除 MDTextField
(及其封闭的 FloatLayout
)。