Стандартный способ сделать это в Tcl/Tk тривиален: вы используете ту же команду связывания, но без окончательного аргумента.
bind .b <Button-1> doSomething
puts "the function is [bind .b <Button-1>]"
=> the function is doSomething
Вы можете сделать что-то подобное с Tkinter, но результаты, к сожалению, не совсем как годный к употреблению:
e1.bind("<Button-1>",doSomething)
e1.bind("<Button-1>")
=> 'if {"[-1208974516doSomething %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break\n'
Очевидно, что Tkinter делает много жонглирования ниже крышки. Одним из решений было бы написать небольшую процедуру помощника, который запоминает это для вас:
def bindWidget(widget,event,func=None):
'''Set or retrieve the binding for an event on a widget'''
if not widget.__dict__.has_key("bindings"): widget.bindings=dict()
if func:
widget.bind(event,func)
widget.bindings[event] = func
else:
return(widget.bindings.setdefault(event,None))
Вы бы использовать его как это:
e1=Entry()
print "before, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
bindWidget(e1,"<Button-1>",doSomething)
print " after, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
Когда я запускаю приведенный выше код я получаю:
before, binding for <Button-1>: None
after, binding for <Button-1>: <function doSomething at 0xb7f2e79c>
В качестве окончательного предостережения я не использую Tkinter, поэтому я не уверен, что ветвления динамически добавляют атрибут к экземпляру виджета. Это кажется безобидным, но если нет, вы всегда можете создать глобальный словарь для отслеживания привязок.
Кристиан использовал отпечаток, который подходит для лямбда. – nosklo 2008-09-26 06:40:41