无法使用tkinter解除绑定功能

时间:2016-06-18 23:20:08

标签: python binding tkinter python-3.5

我正在使用Python 3.5中的Tkinter,我遇到了一个奇怪的问题。

我使用tkinterbook about events and bindings来编写这个简单的例子:

from tkinter import *

root = Tk()

frame = Frame(root, width=100, height=100)

def callback(event):
    print("clicked at", event.x, event.y)
    # frame.unbind("<Button-1>", callback)

frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()

它工作正常,但如果我尝试取消绑定回调(只是取消注释该行),它将失败,并显示以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Delgan\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "C:\Users\Delgan\Desktop\Test\test.py", line 9, in callback
    frame.unbind("<Button-1>", callback)
  File "C:\Users\Delgan\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1105, in unbind
    self.deletecommand(funcid)
  File "C:\Users\Delgan\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 441, in deletecommand
    self.tk.deletecommand(name)
TypeError: deletecommand() argument must be str, not function

目前尚不清楚,我不确定这是否是tkinter中的错误,或者我是否做错了。

frame.unbind("<Button-1>")工作正常,但我想删除这个确切的回调而不是全局删除。

1 个答案:

答案 0 :(得分:3)

unbind的第二个参数是'funcid',而不是函数。 help(root.unbind)返回

  tkinter.Tk实例的

unbind(sequence, funcid=None)方法。   取消绑定事件SEQUENCE的这个小部件,用FUNCID标识的功能。

许多tk函数返回tk对象id,它们可以是其他函数的参数,而bind就是其中之一。

>>> i = root.bind('<Button-1>', int)
>>> i
'1733092354312int'
>>> root.unbind('<Button-1>', i)  # Specific binding removed.

埋在help(root.bind)的输出中是这样的:“绑定将返回一个标识符,允许在没有内存泄漏的情况下删除绑定绑定函数。”