如何在tkinter Listbox的yscrollcommand中为lambda函数传递索引参数
解决方案
核心需要处理两个点:Python lambda的迟绑定特性,以及tkinter滚动回调的参数传递规则,修改步骤如下:
步骤1:新增通用滚动联动方法
替换原来的list0_scrolls_all到list5_scrolls_all这类独立方法,新增你预想的通用方法即可:
def list_scrolls_all(self, index, *args): for i in self.list_indexes[index]: self.listboxes[i].yview_moveto(args[0]) self.scrollbar.set(*args)
类方法的self参数会在调用时自动绑定,不需要手动传递。
步骤2:循环配置所有Listbox的滚动回调
把原来硬编码的6行配置替换为循环,lambda通过默认参数捕获当前循环的索引值,避免迟绑定导致所有回调都拿到最后一个索引的问题:
for idx in range(self.listboxes_column): self.listboxes[idx].config( # 用默认参数idx=idx捕获当前循环的索引值,*args接收滚动回调自动传入的位置参数 yscrollcommand = lambda *args, idx=idx: self.list_scrolls_all(idx, *args) )
原理说明
yscrollcommand触发时会自动传入2个表示滚动位置的参数,用*args接收后直接透传给通用方法即可lambda的默认参数是在函数定义阶段求值的,idx=idx会把每次循环的当前索引值保存下来,不会出现所有回调都共用最后一个循环变量的问题- 该写法支持任意
listboxes_column数值,不用再随着列数修改硬编码的绑定逻辑,同时也修正了你原代码中索引5的列表错误绑定到list4_scrolls_all的笔误。
内容的提问来源于stack exchange,提问作者4001jh
相关产品推荐
相关产品推荐

