python - lambda 与 tkinter 的工作方式很奇怪

标签 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

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

最佳答案

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

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

没有i“解析”为立即的数字。您只需告诉 lambda 在调用时引用 i之后

for 循环结束后的任何时间,i = 3(最后一个值),因此所有 lambda 都会获得 3当他们要求i时。

如果我没记错的话,您可以添加一个函数作为间接方法,它会适本地从周围范围中“捕获”i

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

关于python - lambda 与 tkinter 的工作方式很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305153/

相关文章:

python - 添加 ndarray 和在 python 中转换为密集的稀疏矩阵时出现广播错误

python - python 在计算机中如何存储字符串?

python - 分组后折叠数据框 pandas

java - 以 Java 8 风格重写 "matching algorithm"

python - 如何在 lambda 中为 tkinter 按钮分配变量

Python 导入 BeautifulSoup 不起作用

java - collection.add(()->7) 中 ()-> 的功能是什么?

python tkinter 按钮事件

Python Tkinter 可滚动框架类?

python - Tkinter 麻烦 - 名称框架未定义