绑定不适用于特定部分

时间:2014-11-15 00:33:51

标签: python lambda tkinter key-bindings

所以在我的程序中,我使用了

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,即最后绑定的标签。

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的当前值。