You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为循环创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:45:03