我两天前启动了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"操作员(*
)的文档。