lambda与tkinter奇怪地合作

时间:2013-03-08 23:35:09

标签: python lambda tkinter

我正在尝试使用Tkinter制作计算器。我一直试图清理代码,但遇到了麻烦。创建按钮时,我使用以下代码:

Button(self,text="1",command=lambda: self.addkey("1"),width=self.defaultwidth,height=self.defaultheight).grid(row=5, column=0)
Button(self,text="2",command=lambda: self.addkey("2"),width=self.defaultwidth,height=self.defaultheight).grid(row=5, column=1)
Button(self,text="3",command=lambda: self.addkey("3"),width=self.defaultwidth,height=self.defaultheight).grid(row=5, column=2)

以下是名为

的命令
def addkey(self,key):
            # Adds a given key to the display
            if len(self.displaytext) + len(key) <= self.maxlength:
                self.displaytext += key
                self.display["text"] = self.displaytext

按顺序按下按钮1,2和3时,输出如下:

123

我一直在尝试清理代码,使其看起来更像:

for i in range(3):
    Button(self,text=str(i+1),command=lambda: self.addkey(str(i+1)),width=self.defaultwidth,height=self.defaultheight).grid(row=5, column=i)

这样可以很好地添加按钮,但是当按顺序按下1,2和3时,屏幕上会显示以下内容:

333

我想知道我是否遗漏了某些东西,或者这根本不可能。

1 个答案:

答案 0 :(得分:5)

啊,范围。当你这样做时:

command=lambda: self.addkey(str(i))

“将”i解析为,然后。你只是告诉lambda在调用时引用i,之后

for循环结束后的任何时间i = 3(最后一个值),所以当他们要求3时,你的所有lambdas都会i。< / p>

如果我没有弄错的话,你可以添加一个函数作为间接手段,它将适当地从周围范围“捕获”i

def add_key_f(i):
    return lambda self: self.addkey(i)