2008-09-26 3 views

ответ

2

Ассоциированный вызов, чтобы сделать это для ок C API будет Get_GetCommandInfo которого

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

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

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

0

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

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

+0

Кристиан использовал отпечаток, который подходит для лямбда. – nosklo 2008-09-26 06:40:41

3

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

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

  • Нет связанных вопросов^_^