Получить привязанный обработчик событий в Tkinter

1

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

3 ответа

2
Лучший ответ

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

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

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

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

3

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

0

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

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

  • 0
    Кристиан использовал pprint, что нормально для лямбды.
  • 0
    @nosklo: это было изменено в редактировании.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню