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

时间:2013-03-27 12:55:03

标签: python python-3.x callback tkinter

我提出这个问题是因为我刚看到这个问题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个参数?

2 个答案:

答案 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内部传递其中一个参数到你的另一个函数”。