如何在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
相关产品推荐
相关产品推荐

