在将方法绑定到 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.???
在将方法绑定到 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.???
在 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,所以我不确定动态添加属性到小部件实例的后果是什么。它似乎是无害的,但如果不是,您总是可以创建一个全局字典来跟踪绑定。
为 tk C API 执行此操作的相关调用将是Get_GetCommandInfo,它
将有关命令的信息放在由 infoPtr 指向的 Tcl_CmdInfo 结构中
然而,这个函数在_tkinter.c中的任何地方都没有使用,它是 python 槽Tkinter.py使用的 tk 的绑定。
因此不可能从 tkinter 中获取绑定函数。您需要自己记住该功能。
似乎不是......如果您需要它,为什么不自己保存它,或者使用非匿名函数?
此外,您的代码不能像编写的那样工作:lambda
函数只能包含表达式,不能包含语句,所以是不行的(当成为函数print
时,这将在 Python 3.0 中改变)。print()