我想获取在 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/