Python 使用lambda的回调参数

Python 使用lambda的回调参数,python,tkinter,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 :"+

我两天前开始使用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传递参数,但在条目中键入文本时出现以下错误:

Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“/usr/lib/python2.7/lib-tk/Tkinter.py”,第1413行,在调用中__ 返回self.func(*args) TypeError:()不接受任何参数(给定3个) 我在这里找到一篇帖子,提议用
lambda x:
替换
lambda:
,但我在
TypeError:()中得到了另一个错误,它正好取1个参数(给定3个)


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

正如错误消息所说,
StringVar.trace\u变量
由框架用三个参数调用。因此,lambda函数应该接受这三个参数:

lambda name, idx, mode: ...
以下是参数的说明:

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

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

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

可以找到所谓的“splat”操作符(
*
)的文档。

谢谢,现在它可以工作了,允许lambda接收这3个参数。谢谢你的医生,好心的先生。