所以在我的程序中,我使用了
行l.bind("<Button-1>",lambda e: getSide(i))
当我点击元素时,它可以正常工作。
但是,稍后我会使用
行l.bind("<Button-1>",lambda e: sortby(x))
用于其他本地对象。
getSide
是一个存根,它打印绑定时定义的i
的值。 sortby
是一个Quicksort(用于调试目的)在开始时打印x
的值。奇怪的是,虽然getSide
返回正确的值,但sortby
却没有。
getSide
返回i
,而sortby
打印len(column)-1
,即最后绑定的标签。
答案 0 :(得分:2)
问题是你在循环中创建这些绑定。执行此操作时,必须“捕获”在其参数列表中的lambda函数内使用的任何值:
for x in range(0,len(columns)):
...
l.bind("<Button-1>",lambda e, x=x: sortby(x))
# ^^^
这是因为lambda函数中包含的表达式是在调用时计算的,而不是在定义时计算的。因此,x
中的sortby(x)
将始终引用循环中x
保留的最后一个值。
然而,默认参数在定义时评估。因此,执行x=x
可确保x
引用循环内x
的当前值。