После привязки метода к событию элемента Tkinter есть способ вернуть метод?
>>> root = Tkinter.Tk()
>>> frame = Tkinter.Frame(root, width=100, height=100)
>>> frame.bind('<Button-1>', lambda e: pprint('Click')) # function needed
>>> frame.pack()
>>> bound_event_method = frame.???
Связанный вызов для этого для API tk C будет Get_GetCommandInfo, который
помещает информацию о команде в структуре Tcl_CmdInfo от infoPtr
Однако эта функция не используется нигде в _tkinter.c, которая является привязкой для tk, используемой python trough Tkinter.py.
Поэтому невозможно получить связанную функцию из tkinter. Вам нужно запомнить эту функцию самостоятельно.
Стандартный способ сделать это в Tcl/Tk тривиален: вы используете ту же команду bind, но без окончательного аргумента.
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, поэтому я не уверен, что разветвления динамического добавления атрибута к экземпляру виджета. Это кажется безобидным, но если вы не всегда можете создать глобальный словарь, чтобы отслеживать привязки.
Не похоже... почему бы просто не сохранить его самостоятельно, если он вам понадобится, или использовать не анонимную функцию?
Кроме того, ваш код не работает так, как написано: lambda
функции могут содержать только выражения, а не инструкции, поэтому print
- это не-go (это изменится в Python 3.0, когда print()
станет функцией).