使用lambda回调参数



我两天前启动了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 x:替换lambda:,但是我遇到了TypeError: <lambda>() takes exactly 1 argument (3 given)

的另一个错误

任何解释或来源或信息都将不胜感激:)

正如错误消息所说, 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"的一种。

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

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

可以在此处找到所谓的" Splat"操作员(*)的文档。

最新更新