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

Python Tkinter使用lambda在循环中分配按钮命令,python,tkinter,Python,Tkinter,我试图创建一些按钮s(带有for循环),如下所示: 对于每个按钮,它们都会获得自己的参数(Test get“Test”和Test2 get“Test2”),但当我按下按钮时,它们都会打印“Test2”,这意味着它们使用相同参数的相同函数 如何解决这个问题?问题在于for循环中的lamba。您的lambda正在使用name变量,但是name变量每次都会通过for循环重新分配。因此,最后,所有按钮都会获得在for循环中分配给name的最后一个值。为了避免这种情况,可以在lamba表达式中使用默认关键

我试图创建一些
按钮
s(带有
for
循环),如下所示:

对于每个按钮,它们都会获得自己的参数(Test get
“Test”
和Test2 get
“Test2”
),但当我按下按钮时,它们都会打印
“Test2”
,这意味着它们使用相同参数的相同函数


如何解决这个问题?

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

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

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

这不是tkinter问题,而是关于函数、闭包等嵌套的问题。它也完全存在于其他上下文中。然而+1,因为它准确地描述了发生的事情。@glglgl您是100%正确的。不是我最好的选择,我会修改。非常感谢你的回答。这节省了我几个小时的搜索时间。如果我们想执行多个函数呢?self.a和self.b这对我来说很有效,但我注意到了很多关于lambda的奇怪事情。需要lambda有什么原因吗?
user_button = Tkinter.Button(self.root,
                             text=name,
                             command=lambda name=name: self.a(name))