如何为循环创建的Kivy/KivyMD部件存储唯一引用标识?
解决方案
Kivy 所有控件都支持动态添加自定义实例属性,你可以直接将博文唯一ID、关联数据等信息存在生成的MDTextField/MDButton对象中,不需要额外的复杂配置。以下是两种常用实现方式:
方案1:给输入控件本身添加存储属性
直接在循环创建控件时给它加自定义字段存唯一标识,适合输入框本身需要绑定提交事件(比如回车提交)的场景:
from functools import partial from kivymd.app import MDApp from kivymd.uix.button import MDFlatButton from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.textfield import MDTextField class UserInput(MDTextField): # 可提前声明存储博文ID的属性,也可以直接动态添加 post_id = "" def print_input(self, *args): # 直接从自身属性拿对应的博文ID更新Firebase即可 print(f"对应博文ID:{self.post_id},评论内容:{self.text}") self.text = "" class MainApp(MDApp): def build(self): screen = MDGridLayout(cols=1, spacing=20) for i in range(5): # 这里替换成你实际从Firebase获取的博文唯一ID cur_post_id = f"blog_{i}" input = UserInput() # 直接给控件添加自定义属性存唯一标识 input.post_id = cur_post_id screen.add_widget(input) button = MDFlatButton(text=f"Submit #{i}", on_release=partial(input.print_input)) screen.add_widget(button) return screen MainApp().run()
方案2:通过partial直接传递唯一标识
不需要修改输入控件类,直接在绑定按钮回调时把博文ID和对应的输入框一起作为参数传递,逻辑更聚合:
from functools import partial from kivymd.app import MDApp from kivymd.uix.button import MDFlatButton from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.textfield import MDTextField class MainApp(MDApp): # 统一的评论提交回调 def submit_comment(self, post_id, input_widget, *args): print(f"对应博文ID:{post_id},评论内容:{input_widget.text}") input_widget.text = "" # 直接使用post_id更新Firebase对应博文的评论数据即可 def build(self): screen = MDGridLayout(cols=1, spacing=20) for i in range(5): cur_post_id = f"blog_{i}" input = MDTextField() screen.add_widget(input) # partial按顺序传参:第一个是回调函数,之后依次是要提前绑定的参数 button = MDFlatButton( text=f"Submit #{i}", on_release=partial(self.submit_comment, cur_post_id, input) ) screen.add_widget(button) return screen MainApp().run()
两种方案都可以按需选择,除了字符串类型的ID,你也可以直接把完整的博文数据对象存在控件属性里,方便后续逻辑调用。
内容的提问来源于stack exchange,提问作者Ian Rajkumar
相关产品推荐
相关产品推荐

