将方法绑定到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.???
有帮助吗?

解决方案

对tk C API执行此操作的相关调用将是 Get_GetCommandInfo 哪个

  

放置有关命令的信息   在Tcl_CmdInfo结构中指出   通过infoPtr

但是,在 _tkinter.c 这是python通过使用的tk的绑定Tkinter.py

因此无法从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,因此我不确定动态向窗口小部件实例添加属性的后果是什么。它似乎是无害的,但如果不是,你总是可以创建一个全局字典来跟踪绑定。

似乎不是......为什么不自己保存,如果你需要它,或者使用非匿名函数?

此外,您的代码无法正常工作: lambda 函数只能包含表达式,而不能包含语句,所以 print 是不行的(这会改变当 print()成为一个函数时,Python 3.0。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top