2008-09-26 75 views
1

將方法綁定到Tkinter元素的事件之後,是否有辦法返回該方法?在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.??? 

回答

2

相關的調用來完成,對於TK C API將Get_GetCommandInfo

地方大約在Tcl_CmdInfo結構命令 信息指出 由infoPtr

不過這個功能在_tkinter.c的任何地方都沒有使用,這是python低谷Tkinter.py使用的tk的綁定。

因此不可能從tkinter中獲得綁定函數。你需要自己記住那個功能。

0

不似乎是......爲什麼不乾脆自己保存它,如果你要需要它,或使用非匿名函數?

此外,您的代碼不起作用書面:lambda函數只能包含表達式,沒有語句,所以print是一個不走(這將在Python 3.0時print()成爲一個功能改變)。

+0

Cristian使用了pprint,這對lambda來說可以。 – 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太多,所以我不確定分支是什麼動態添加一個屬性到一個小部件實例。它似乎是無害的,但如果不是,你總是可以創建一個全局字典來跟蹤綁定。

相關問題