Python 无法使用tkinter解除函数绑定

Python 无法使用tkinter解除函数绑定,python,binding,tkinter,python-3.5,Python,Binding,Tkinter,Python 3.5,我在Python3.5中使用Tkinter,遇到了一个奇怪的问题 我用这个简单的例子: 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("&

我在Python3.5中使用Tkinter,遇到了一个奇怪的问题

我用这个简单的例子:

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()
从tkinter导入*
root=Tk()
框架=框架(根,宽度=100,高度=100)
def回调(事件):
打印(“单击”,事件x,事件y)
#frame.unbind(“,回调)
frame.bind(“,回调)
frame.pack()
root.mainloop()
它工作正常,但如果我尝试解除回调绑定(只需取消对该行的注释),它将失败,并出现以下错误:

Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Users\Delgan\AppData\Local\Programs\Python\Python35\lib\tkinter\\uuuuuu init\uuuuuu.py”,第1549行,在调用中__ 返回self.func(*args) 文件“C:\Users\Delgan\Desktop\Test\Test.py”,第9行,在回调中 frame.unbind(“,回调) 文件“C:\Users\Delgan\AppData\Local\Programs\Python\35\lib\tkinter\\uuuuu init\uuuuuu.py”,第1105行,处于解除绑定状态 self.deletecommand(funcid) 文件“C:\Users\Delgan\AppData\Local\Programs\Python\Python35\lib\tkinter\\uuuu init\uuuu.py”,第441行,在deletecommand中 self.tk.deletecommand(名称) TypeError:deletecommand()参数必须是str,而不是function 这还不清楚,我不确定这是tkinter中的错误还是我做错了什么


frame.unbind(“”)可以正常工作,但是我想删除这个精确的回调,而不是全局删除。

unbind
的第二个参数是“funcid”,而不是函数<代码>帮助(root.unbind)返回

unbind(sequence,funcid=None)
tkinter.Tk实例的方法。 为事件序列解除此小部件的绑定使用FUNCID标识的函数

许多tk函数返回可以作为其他函数参数的tk对象ID,bind就是其中之一

>>> i = root.bind('<Button-1>', int)
>>> i
'1733092354312int'
>>> root.unbind('<Button-1>', i)  # Specific binding removed.
>i=root.bind(“”,int)
>>>我
“1733092354312int”
>>>根。解除绑定(“”,i)#特定绑定已移除。

help(root.bind)
的输出中隐藏着这样一个信息:“bind将返回一个标识符,以允许使用unbind删除绑定函数,而不会导致内存泄漏。”

我无法重现您的问题。哦,这很有意义,谢谢,我没有想到这一点。也许API在Python的最新版本中发生了变化,这可以解释为什么我发现的示例使用的是函数本身而不是funcid,以及为什么@BillalBEGUERADJ没有相同的问题。我知道这来得晚,但对于所有将来遇到此问题的人来说:如果您只想解除绑定此函数,请执行以下操作:')root.unbind(“,)因为上面的示例将删除具有给定序列('''''''''''''')的所有绑定,而不匹配函数id。