如何将参数传递给StringVar的回调?

时间:2018-12-23 18:56:30

标签: python tkinter

我已经使用tkinter设置了一个Entry小部件,并且正在使用StringVar来跟踪对其的任何更改。但是,当我尝试使用回调函数时,发现无法将任何参数传递给它。

这是我尝试过的:

hpstring = StringVar()
hpstring.trace("w", hptrace)
hpstring.set("0")
hpbox = tk.Entry(frame, textvariable=hpstring)
hpbox.pack()

def hptrace(*args):
    print(hpstring)

此操作失败,因为未定义hpstring。

hpstring = StringVar()
hpstring.trace("w", hptrace(hpstring))
hpstring.set("0")
hpbox = tk.Entry(frame, textvariable=hpstring)
hpbox.pack()

def hptrace(*args):
    print(hpstring)

这也以某种方式失败了。

hpstring = StringVar()
hpstring.trace("w", lambda hpstring: hptrace(hpstring))
hpstring.set("0")
hpbox = tk.Entry(frame, textvariable=hpstring)
hpbox.pack()

def hptrace(*args):
    print(hpstring)

这一次,它失败了,因为“()接受了1个位置参数,但给出了3个”。

有什么办法让我的回调函数(hptrace)以hpstring作为参数?

1 个答案:

答案 0 :(得分:1)

  

有什么办法让我的回调函数(hptrace)以hpstring作为参数?

您可以使用lambdafunctools.partial。要记住的重要一点是the function called by the trace is called with three arguments,因此,您对trace发出的任何命令都必须接受这三个参数。

如果您只想向lambda发送hpstring,则使用hptrace,您的代码应如下所示:

hpstring.trace("w", lambda var_name, var_index, operation: hptrace(hpstring))

注意:在尝试使用hptrace之前,您需要先定义localField,这是您问题中的代码无法做到的。