Python lambda 不从函数获取变量

标签 python python-3.x tkinter

我想获取在 for 循环中单击了哪个按钮,但我无法在函数内获取按钮,并且该按钮是由 for 循环生成的,代码如下:

from tkinter import * 
from tkinter import ttk

class Application(Tk):
    
    def __init__(self):
        super(Application, self).__init__()
        self.create_grid()

    def create_grid(self):
        for i in range(1, 4):
            self.btn= ttk.Button(self, text="", command=lambda btn=self.btn: self.clik(btn))
            self.btn.grid(ipadx=20, ipady=20, row=i, column=0)


    def clik(self, btn):
        print(btn)


if __name__ == '__main__':
    app = Application()
    app.mainloop()

错误:

    self.btn= ttk.Button(self, text="", command=lambda btn=self.btn: self.clik(btn))
  File "fakepath\__init__.py", line 2346, in __getattr__
    return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'btn'

感谢您的帮助。

最佳答案

在Python中,首先评估赋值的RHS,然后将值存储在LHS左右。如果您注意到的话:

self.btn= ttk.Button(self, text="", command=lambda btn=self.btn: self.clik(btn))

self.btn 仅在评估该行的 RHS 后才定义,但在该行本身内部,您引用的是未定义的 self.btn (然而)。因此会出现没有属性 btn 的错误。所以你可以做的是在下一行中分配命令:

self.btn = ttk.Button(self, text="")
self.btn['command'] = lambda btn=self.btn: self.clik(btn)

关于Python lambda 不从函数获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67916683/

相关文章:

xml - Odoo 路由给出 "Internal Server Error"错误页面

python - 计算器 - 尝试从 'for' 中获取第一个数字并将其用作 INIT_VALUE

python - 如何用Tkinter绘制正弦波?

python - Tkinter 中的数据包生成器

Python:遍历受约束的所有整数组合(找到函数的最小值)

python-3.x - python中的嵌套for循环没有完全迭代

python - 如何保存 gtk TreeView (排序顺序和位置)?

python - tkinter .after() 秒和分

python - 如何根据 Pandas 数据框的条件增加计数器?

python - 设置类变量的 pythonic 方法是什么?