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

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

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

def a(self, name):
    print name

users = {"Test":"127.0.0.0", "Test2":"128.0.0.0"}row = 1for 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获取Test和Test 2获取Test 2),但是当我按下按钮时,它们都会打印“test 2”,这意味着它们使用相同的参数使用相同的函数。

我怎么解决这个问题?


斯蒂芬大帝
浏览 1293回答 2
2回答

炎炎设计

问题是for循环中的Lamba。您的lambda正在使用name变量,但是name变量每次通过for循环重新分配。最后,所有的按钮都得到了最后一个值name在for循环中分配给。为了避免这种情况,可以在Lamba表达式中使用默认关键字参数,如下所示:user_button = Tkinter.Button(self.root,                              text=name,                              command=lambda name=name: self.a(name))对象的当前值。name变量到Lamba‘sname关键字参数每次通过循环,产生期望的效果。

慕田峪7331174

它不是一个简单的问题,它是一个关于函数嵌套、闭包等的问题,它也存在于完全不同的上下文中。尽管如此,正如它所描述的那样,+1确实描述了发生了什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python