Kivy列表项点击无法传递对应vid_id,总是返回最后一项问题求助
问题解决:Kivy循环中lambda绑定变量导致的参数错误
这是Python循环里用lambda的经典坑——你写的lambda捕获的是循环变量i的引用,而非每次循环时i的具体值。等用户点击列表项时,循环已经执行完毕,i固定为最后一次循环的索引,所以不管点哪一项,传入的都是最后一个vid_id的值。
给你两种实用解决办法:
方法一:用lambda默认参数捕获当前值
修改循环内的lambda,把当前迭代的vid_id[i]作为默认参数传入,这样定义lambda时就会把当时的具体值绑定好:
class SecondWindow(Screen): def on_enter(self): try: self.ids.container.clear_widgets() except: pass for i in range(len(vid_list)): # 用默认参数捕获当前迭代的vid_id值 self.ids.container.add_widget( OneLineAvatarIconListItem( text=vid_list[i], on_release=lambda _, v_id=vid_id[i]: self.send_link(v_id) ) ) def send_link(self, v_id): print(v_id)
注意lambda里的_,是用来接收on_release事件触发时自动传入的控件对象,避免干扰我们需要的参数。
方法二:用functools.partial绑定参数
先导入functools.partial,用它提前把send_link的参数绑定好,彻底避开lambda的引用问题:
from functools import partial class SecondWindow(Screen): def on_enter(self): try: self.ids.container.clear_widgets() except: pass for i in range(len(vid_list)): # 直接用partial绑定当前的vid_id[i] self.ids.container.add_widget( OneLineAvatarIconListItem( text=vid_list[i], on_release=partial(self.send_link, vid_id[i]) ) ) def send_link(self, v_id): print(v_id)
partial会帮我们把参数提前固定为当前迭代的具体值,点击时直接调用绑定好的函数即可。
内容的提问来源于stack exchange,提问作者DXNI
相关产品推荐
相关产品推荐

