Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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/15.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
Python3中与tkinter跟踪关联的回调函数_Python_Python 3.x_Callback_Tkinter - Fatal编程技术网

Python3中与tkinter跟踪关联的回调函数

Python3中与tkinter跟踪关联的回调函数,python,python-3.x,callback,tkinter,Python,Python 3.x,Callback,Tkinter,我提出这个问题是因为我刚刚看到这个问题 我使用lambda添加另一个参数。 代码如下: from tkinter import * def callbackfunc(*args, **kwargs): print(args,kwargs) class App(object): def __init__(self, master): frame = Frame(master) frame.pack() optionvalue =

我提出这个问题是因为我刚刚看到这个问题

我使用
lambda
添加另一个参数。 代码如下:

from tkinter import *

def callbackfunc(*args, **kwargs):
    print(args,kwargs)

class App(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        optionvalue = IntVar(master)
        optionvalue.set(2)
        optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
        self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
        self.optionmenu.pack()

root = Tk()
app = App(root)
root.mainloop()
我的输出:
('test',){}
我想知道的是:
如果我使用lambda,为什么不输出其他3个参数?

问题是这一行:

optionvalue.trace("w",callbackfunc())
optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
您不是将
callbackfunc
传递给
optionvalue.trace
,而是调用它——没有参数,因此是您的输出

您应该改为使用此选项:

optionvalue.trace("w", callbackfunc)

没有括号时,如。

中所示,问题是这一行:

optionvalue.trace("w",callbackfunc())
optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
您不是将
callbackfunc
传递给
optionvalue.trace
,而是调用它——没有参数,因此是您的输出

您应该改为使用此选项:

optionvalue.trace("w", callbackfunc)

没有括号,如。

让我们看看这行:

optionvalue.trace("w",callbackfunc())
optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
这在概念上几乎等同于这样做:

def i_dont_care_what_the_name_is(a,b,c,x='test'):
    callbackfunc(x)
optionvalue.trace("w", i_dont_care_what_the_name_is)
当跟踪触发时,它用三个值调用lambda——这是记录在案的行为。无论是否使用lambda,Tkinter都会向回调传递三个参数

创建lambda是为了获取第四个可选值,这是使用lambda的一种非常常见的方法。但是,在lambda中,您显式调用
callbackfunc
,并且只传递一个值x

其工作原理如下:回调使用三个参数调用lambda。您已将lambda定义为具有额外的第四个参数。然后lambda调用您的回调,但您只给它一个参数


因此,对于“如果我使用lambda,为什么没有输出其他3个参数?”这个问题的答案是“因为您只从lambda内部将其中一个参数传递给其他函数”

让我们看看这一行:

optionvalue.trace("w",callbackfunc())
optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
这在概念上几乎等同于这样做:

def i_dont_care_what_the_name_is(a,b,c,x='test'):
    callbackfunc(x)
optionvalue.trace("w", i_dont_care_what_the_name_is)
当跟踪触发时,它用三个值调用lambda——这是记录在案的行为。无论是否使用lambda,Tkinter都会向回调传递三个参数

创建lambda是为了获取第四个可选值,这是使用lambda的一种非常常见的方法。但是,在lambda中,您显式调用
callbackfunc
,并且只传递一个值x

其工作原理如下:回调使用三个参数调用lambda。您已将lambda定义为具有额外的第四个参数。然后lambda调用您的回调,但您只给它一个参数


因此,对于“如果我使用lambda,为什么没有输出其他3个参数?”这个问题的答案是“因为您只从lambda内部将其中一个参数传递给其他函数”

我已经编辑了我的问题,事实上这就是我想问的。谢谢你,你仍然用
x
调用
callbackfunc
,忽略
a
b
c
。您应该使用类似于
lambda,b,c,x=“test”:callbackfunc(a,b,c,x)
的东西。
lambda,b,c,x=“test”:callbackfunc(a,b,c,x)
确实有效,但是如果我使用
lambda x='test':callbackfunc(x)
,那么它会引发
TypeError:()从0到1取位置参数,但给出了3个
矛盾的是,
TypeError
告诉我,虽然我写了
callbackfunc(x)
,但我实际上传入了a、b、c,但我无法从
*args
中获取它们。不,这意味着你的
lambda
是用3个参数调用的,但您仅使用1(可选)参数定义它。也许你应该使用
optionvalue.trace(“w”,print)
来检查它的调用方式(
print
是Python 3中的一个函数)。我已经编辑了我的问题,事实上这就是我想问的。谢谢你,你仍然用
x
调用
callbackfunc
,忽略
a
b
c
。您应该使用类似于
lambda,b,c,x=“test”:callbackfunc(a,b,c,x)
的东西。
lambda,b,c,x=“test”:callbackfunc(a,b,c,x)
确实有效,但是如果我使用
lambda x='test':callbackfunc(x)
,那么它会引发
TypeError:()从0到1取位置参数,但给出了3个
矛盾的是,
TypeError
告诉我,虽然我写了
callbackfunc(x)
,但我实际上传入了a、b、c,但我无法从
*args
中获取它们。不,这意味着你的
lambda
是用3个参数调用的,但您仅使用1(可选)参数定义它。也许您应该使用
optionvalue.trace(“w”,print)
来检查它的调用方式(
print
是Python 3中的一个函数)。如果我使用
lambda x='test':callbackfunc(x)
,那么它会引发TypeError:
()获取0到1个位置参数,但给出了3个
。我想确定原因是否是:当不使用lambda时,Python会自动将3个参数传递给应该接收这些参数的函数/方法。然后使用lambda,这次是
lambda
接受这些参数,并且
lambda
请求显式传入参数。这就是原因吗?您和Schnouki都没有对此给出解释。@laike9m:当Tkinter调用回调时,它将始终传递三个参数,因为这就是设计的目的。这就是为什么如果将lambda定义为只接受一个参数,就会出现错误。回调必须至少包含三个参数。这与您是否使用lambda无关——tkintre不知道。它将始终传递三个参数。必须提供至少接受三个参数的回调。它可以是正确的函数,也可以是lambda,但无论如何,它必须至少包含三个参数。如果使用
lambda x='test':callbackfunc(x)
,则它会引发TypeError:
()接受fr