如何解决具有不同“迭代次数”标签的KivyMD动态标签管理
我使用了KivyMD文档中有关“动态标签管理”的代码,因此用户可以添加/删除标签。但是,创建的每个选项卡显然都是相同的,因此我放入其中的小部件也是如此。这意味着,如果我要尝试从例如标签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.5,0.9
Rectangle:
pos: self.pos
size: self.size
MDTabs:
id: tabs
FloatLayout:
canvas:
Color:
rgba: 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
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,1
on_release: app.remove_tab()
选项卡1,其中MDTextField中的输入为“ Hi”:
Tab2,其中MDTextField中的输入已从Tab中复制:
无论如何,仍然可以让用户添加和删除选项卡,但要使所有小部件(例如.kv文件中的 MDTextField )具有不同的ID,以便我可以访问用户输入从他们?预先谢谢您,如果这个问题的措词不好,请询问更多信息!
解决方法
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
的{{1}}部分,只需将其添加到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
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,1
on_release: app.remove_tab()
规则中删除MDTextField
(及其封闭的FloatLayout
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。