在Tkinter中获取绑定事件处理程序
时间:2020-03-06 14:46:06 来源:igfitidea点击:
将方法绑定到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.???
解决方案
似乎不是……为什么不将其保存起来(如果需要),或者使用非匿名函数呢?
另外,代码不能按书面形式工作:lambda函数只能包含表达式,而不能包含语句,因此print是一个强制选项(当print()成为函数时,它将在Python 3.0中更改)。
为tk C API执行此操作的关联调用为Get_GetCommandInfo
places information about the command in the Tcl_CmdInfo structure pointed to by infoPtr
但是,此函数未在_tkinter.c中的任何地方使用,它是python槽Tkinter.py使用的tk绑定。
因此,不可能从tkinter中获得绑定函数。我们需要自己记住该功能。
在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,所以我不确定向小部件实例动态添加属性的后果。这似乎是无害的,但是如果没有的话,我们总是可以创建一个全局字典来跟踪绑定。