我提出这个问题是因为我刚看到这个问题What are the limitations of callback functions associated with Tkinter traces?。
我使用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个参数?
答案 0 :(得分:2)
问题在于这一行:
optionvalue.trace("w",callbackfunc())
不是将callbackfunc
传递给optionvalue.trace
,而是调用它 - 没有args,因此输出。
你应该改用:
optionvalue.trace("w", callbackfunc)
没有括号,如question you linked。
答案 1 :(得分:2)
让我们来看看这一行:
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内部传递其中一个参数到你的另一个函数”。