Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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/6/cplusplus/124.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 为什么不';t当使用lambda时,我需要为tkinter command=指定参数_Python_Tkinter_Lambda - Fatal编程技术网

Python 为什么不';t当使用lambda时,我需要为tkinter command=指定参数

Python 为什么不';t当使用lambda时,我需要为tkinter command=指定参数,python,tkinter,lambda,Python,Tkinter,Lambda,为什么在使用command=和lambda函数(因为我在传递变量)将方法链接到tkinter按钮时,我不必将它们作为参数放在lambda函数中。。。。例如,在普通代码中,我会写: def basicPrint(a,b): print(a+b) 作为lambda,我将使用: basicPrint = lambda a,b: print(a+b) 但是,当它用于tkinter按钮时,我必须: command=lambda: self.basicPrint(a,b)) i、 例如,我必须在单词l

为什么在使用
command=
和lambda函数(因为我在传递变量)将方法链接到tkinter按钮时,我不必将它们作为参数放在lambda函数中。。。。例如,在普通代码中,我会写:

def basicPrint(a,b): print(a+b)
作为lambda,我将使用:

basicPrint = lambda a,b: print(a+b)
但是,当它用于tkinter按钮时,我必须:

command=lambda: self.basicPrint(a,b))
i、 例如,我必须在单词lambda之后省略a,b,但在“正常”代码中调用时会引发错误:

TypeError: <lambda>() takes 0 positional arguments but 2 were given
TypeError:()接受0个位置参数,但提供了2个

那么,为什么特金特的情况会有所不同呢?与其中的“self”有关吗?

命令指定回调,这是您编写的框架将调用的函数。框架将指定函数的签名,函数必须符合该签名,因为框架中的调用代码是以固定方式调用函数的。在这种特定情况下,您无法告诉
tkinter
要传递给函数的值。所以它不会通过任何测试。这将导致运行时错误,为了避免这种情况,
tkinter
会事先检查函数的签名,如果签名不符合记录的规范,则会进行投诉。因此,您编写了一个函数,它符合tkinter的规范,但依赖于全局变量的存在来工作。

tkinter就是这样设计的。绑定到事件的函数必须接受单个参数。该参数是描述事件的对象。当您向
命令
提供函数时,该函数必须无需任何参数即可调用


无论您使用
lambda
functools.partial
,还是仅仅提供对标准函数的引用,都必须遵循这些规则。

可能是因为a和b正在关闭,而不是在调用lambda时传入。从另一个函数中调用的函数必须具有与调用者相同的参数,这当然不是一般情况,为什么会是这种情况?您省略了command的
a,b
,因为command函数不需要任何参数。