Tkinter使用lambda循环分配按钮命令

时间:2013-07-16 13:19:05

标签: python loops button lambda tkinter

我正在尝试创建一些按钮(带有for),如下所示:

def a(self, name):
    print name

users = {"Test":"127.0.0.0", "Test2":"128.0.0.0"}
row = 1
for name in users:
    user_button = Tkinter.Button(self.root,
                                 text=name,
                                 command=lambda: self.a(name))
    user_button.grid(row = row, column = 0)
    row+=1

并且每个按钮都有自己的参数(Test getting Test和Test2得到Test2)但是当我按下按钮时它们都打印“Test2”,这意味着它们使用相同的函数和相同的参数。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:37)

问题是你在for循环中的lamba。您的lambda正在使用name变量,但每次通过for循环都会重新分配name变量。因此,最后,所有按钮都获得了for {循环中name分配给的最后一个值。为避免这种情况,您可以在lamba表达式中使用默认关键字参数,如下所示:

user_button = Tkinter.Button(self.root,
                             text=name,
                             command=lambda name=name: self.a(name))

每次循环时,都会将name变量的当前值绑定到lamba的name关键字参数,从而产生所需的效果。