Python lambda未从函数中获取变量
我想获取在for循环中单击的按钮,但我无法获取函数中的按钮,该按钮由for循环生成,代码如下:Python lambda未从函数中获取变量,python,python-3.x,tkinter,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):
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)
命令在单独的行中
self.btn.configure(command=lambda btn=self.btn:self.clik(btn))
您也可以从functools导入部分,然后self.btn.config(command=partial(self.click,self.btn))
(显然将导入放在代码的开头)@matisshey!它也可以工作,但里面发生了什么?据我所知,它只是返回一个带有给定参数的函数,这样它每次都会使用这些参数运行,基本上与lambda函数相同,只是比较短,可能还有其他用途。你可以加入disccsion吗?@TangerCity我没有链接,你应该在其中标记我。