Получить привязанный обработчик событий в Tkinter - PullRequest
1 голос
/ 26 сентября 2008

После привязки метода к событию элемента 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.???

Ответы [ 3 ]

3 голосов
/ 22 октября 2008

Стандартный способ сделать это в 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, поэтому я не уверен, каковы будут последствия динамического добавления атрибута в экземпляр виджета. Это кажется безвредным, но если нет, вы всегда можете создать глобальный словарь для отслеживания привязок.

2 голосов
/ 26 сентября 2008

Связанный вызов для этого для API tk C будет Get_GetCommandInfo , который

размещает информацию о команде в структуре Tcl_CmdInfo указал по infoPtr

Однако эта функция нигде не используется в _tkinter.c , которая является привязкой для tk, используемой через python Tkinter.py .

Поэтому невозможно получить связанную функцию из tkinter. Вам нужно запомнить эту функцию самостоятельно.

0 голосов
/ 26 сентября 2008

Кажется, что нет ... почему бы не сохранить его самостоятельно, если оно вам понадобится, или использовать неанонимную функцию?

Кроме того, ваш код не работает так, как написано: lambda функции могут содержать только выражения, а не операторы, поэтому print не допускается (это изменится в Python 3.0, когда print() станет функцией) .

...