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

如何在Kivy中从动态添加的ThreeLineListItem控件传递person['id']参数

实现方法

你遇到的是Python lambda的晚绑定特性导致的问题:循环里的lambda不会即时捕获每次迭代的person['id']值,只会在触发回调时取最后一次迭代的person值,两种最简单的实现方案如下:

方案1:给lambda添加默认参数(最快捷)

利用Python函数默认参数在定义时就会赋值的特性,直接把当前迭代的person['id']绑定到lambda参数上,修改代码如下:

[...]
data = response.json() #response from an API request
if response.status_code == 200:
    for person in data:
        print(person['id'])
        self.ids.person_mdlist.add_widget(
            ThreeLineListItem(
                text=str(person['name']),
                secondary_text=str(person['document']),
                tertiary_text=str(person['descript']),
                # 新增默认参数pid绑定当前person的id
                on_release=lambda x, pid=person['id']: self.test(x, pid),
            ),
        )

# 对应的test方法同步新增参数接收人员id
def test(self, instance, person_id):
    print("当前选中的人员ID为:", person_id)
    # 后续直接用person_id调用API即可

方案2:给控件添加自定义属性存储ID

如果后续需要在其他场景也读取这个列表项对应的人员ID,可以直接把ID存到ThreeLineListItem实例的自定义属性里,回调时直接从控件实例读取:

[...]
data = response.json() #response from an API request
if response.status_code == 200:
    for person in data:
        print(person['id'])
        self.ids.person_mdlist.add_widget(
            ThreeLineListItem(
                text=str(person['name']),
                secondary_text=str(person['document']),
                tertiary_text=str(person['descript']),
                person_id=person['id'], # 给控件添加自定义属性存储id
                on_release=lambda x: self.test(x),
            ),
        )

# test方法直接从控件实例取属性
def test(self, instance):
    person_id = instance.person_id
    print("当前选中的人员ID为:", person_id)

内容的提问来源于stack exchange,提问作者Chicken Choker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:57:04