我正在使用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>")
工作正常,但我想删除这个确切的回调而不是全局删除。
答案 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)
的输出中是这样的:“绑定将返回一个标识符,允许在没有内存泄漏的情况下删除绑定绑定函数。”