Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lambda未从函数中获取变量_Python_Python 3.x_Tkinter - Fatal编程技术网

Python lambda未从函数中获取变量

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):

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

命令在单独的行中
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我没有链接,你应该在其中标记我。