lambda和tkin一起工作很奇怪

2024-05-20 20:46:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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

我想知道我是否错过了什么,或者这是根本不可能的。你知道吗


Tags: lambdakey代码textselfcolumnbuttonwidth
1条回答
网友
1楼 · 发布于 2024-05-20 20:46:12

啊,范围界定。当您这样做时:

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

你不是在把i分解成一个数字,然后就在那里。您只是告诉lambda在被调用时引用i,然后再调用。你知道吗

for循环结束后的任何时候,i = 3(最后一个值),因此所有lambda在请求i时都会得到3。你知道吗

如果我没弄错的话,您可以添加一个函数作为间接寻址的方法,它将适当地从周围的范围中“捕获”i。你知道吗

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

相关问题 更多 >