0

我提出这个问题是因为我刚刚看到了这个问题与 Tkinter 跟踪相关的回调函数有哪些限制?.

lambda用来添加另一个argumentmnt。这是代码:

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 个参数?

4

2 回答 2

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 内部传递给您的其他函数”。

于 2013-03-27T17:15:46.113 回答
2

问题是这一行:

optionvalue.trace("w",callbackfunc())

而不是传递callbackfuncoptionvalue.trace,你调用它 - 没有参数,因此你的输出。

你应该改用这个:

optionvalue.trace("w", callbackfunc)

没有括号,就像你链接的问题一样。

于 2013-03-27T13:08:59.950 回答