2014-02-04 2 views
1

Я начал Python (2.7.3) два дня назад, и мне нужно использовать параметры в моих функциях обратных вызовов GUI. Я искал любую информацию здесь и на effbot, но я не могу узнать, что не так в моем случае.Параметры обратного вызова с использованием lambda

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() 

Я пытался использовать лямбду, чтобы получить мои пары прошли, но я получаю эту ошибку при вводе текста в Вход:

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

Как говорится в сообщении об ошибке, StringVar.trace_variable вызывается с тремя аргументами с помощью фреймворка. Таким образом, ваша функция лямбда должна принять эти три аргумента:

lambda name, idx, mode: ... 

От http://www.astro.washington.edu/users/rowen/ROTKFolklore.html здесь описание аргументов:

  • Имя переменной Tk. Это не сам объект переменной Tk, но вы можете использовать это имя для получения или установки значения через root.globalgetvar (имя) и root.globalsetvar (имя). К сожалению, я не нашел способа получить реальный объект переменной Tk от его имени; root.nametowidget (varName), похоже, не работает для переменных Tk.
  • Индекс переменной, если переменная Tk является массивом, иначе пустая строка. Я не знаю, как создать массив Tk переменных в Tkinter (но это легко в Tk). Если вы это выясните, вы можете определить, является ли индекс строковым представлением целого числа или целого числа (моя догадка - это строка).
  • Режим доступа, один из «w», «r» или «u».
+0

Спасибо, сейчас работает лямбда, разрешено получать эти 3 параметра. Спасибо за док, добрый сэр. – callisto

0

Если вы не заинтересованы в параметрах, передаваемых в функцию обратного вызова, вы можете использовать:

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

Документация для так называемой «знак» оператора (*) можно найти here.

Смежные вопросы