使用lambda的回调参数

时间:2014-02-04 17:11:06

标签: python tkinter

两天前我开始使用Python(2.7.3),我需要在GUI回调函数中使用参数。我一直在寻找任何关于effbot的信息,但我不知道我的情况有什么问题。

from Tkinter import *
fenetre = Tk()
var_texte = StringVar()
ligne_texte = Entry(fenetre, textvariable=var_texte ,width=30)

def callback(s):
    print("we got there with :"+s)

trace_name = var_texte.trace_variable("w",lambda: callback(ligne_texte.get()))
ligne_texte.pack()
fenetre.mainloop()

我尝试使用lambda来传递我的参数但是当我在条目中键入文本时出现此错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
TypeError: <lambda>() takes no arguments (3 given)

我在此处发现了一条建议将lambda:替换为lambda x:的帖子,但我在TypeError: <lambda>() takes exactly 1 argument (3 given)

时收到了另一个错误

非常感谢任何解释或来源或信息:)

2 个答案:

答案 0 :(得分:2)

正如错误消息所示,框架使用三个参数调用StringVar.trace_variable。所以你的lambda函数应该接受这三个参数:

lambda name, idx, mode: ...

http://staff.washington.edu/rowen/ROTKFolklore.html这里是参数的描述:

  • Tk变量的名称。这不是Tk变量对象本身,但您可以使用该名称通过root.globalgetvar(name)和root.globalsetvar(name)获取或设置值。不幸的是,我还没有找到任何方法从名称中获取实际的Tk变量对象; root.nametowidget(varName)似乎不适用于Tk变量。
  • 变量索引,如果Tk变量是数组,则为空字符串。我不知道如何在Tkinter中创建一个Tk变量数组(但在Tk中很容易)。如果你想出来,你可以确定索引是一个整数的字符串表示,还是一个整数(我的猜测是它是一个字符串)。
  • 访问模式,“w”,“r”或“u”之一。

答案 1 :(得分:0)

如果您对传递给回调的参数不感兴趣,可以使用:

lambda *args: callback(ligne_texte.get())

可以找到所谓的“splat”运算符(*)的文档here