2014-03-24 82 views
0

我有一个功能,比如说foo和它应该事件绑定事件绑定到窗口小部件不工作

def foo: 
     for x in widget_list: 
       widget.config(command = lambda: self.function(widget_list.index(x)) 

    def function(index): 
     do something here.... 
     print index 

窗列表包含按钮,每当我点击相应的按钮,他们应该打印到IDLE是它们的索引,但是发生的是,我点击的所有按钮最终都会打印widget_list的最后一个索引。我猜测,虽然对于迭代,函数的参数也发生了变化,因此只保留最后一个索引。反正有没有把前面的索引绑定到按钮上?

+0

你猜对了,只有x的最后一个值用于你的lambda表达式。您可能会在此答案中找到解决办法:http://stackoverflow.com/a/2295368 – FabienAndre

+0

最后。我一直在寻找这样的解决方案大约一个星期,但我想我已经将这个问题归类为tkinter唯一的问题。无论如何,谢谢你,因为我现在可以继续工作。 :D – user3455382

+0

[通过Tkinter中的按钮传递参数给函数,循环中的starnge行为](http://stackoverflow.com/questions/18510403/passing-argument-to-a-function-via-a-按钮功能于Tkinter的-starnge - 行为 - 在-LOO) – FabienAndre

回答

0

最简单的解决方法是,以确保您的拉姆达使用x当前值:

widget.config(command = lambda x=x: self.function(widget_list.index(x)) 

这迫使x是一个默认参数的功能,默认值是值在定义lambda的时候x