Events 虚拟事件多个绑定未按预期工作

Events 虚拟事件多个绑定未按预期工作,events,tkinter,Events,Tkinter,以下是我的代码的简化版本: from tkinter import * class MyCustomWidget(Canvas): def __init__(self, parent = None, **options): Canvas.__init__(self, parent, options) self.box = self.create_rectangle(0, 0, 300, 300,fill="blue") self.bind

以下是我的代码的简化版本:

from tkinter import *
class MyCustomWidget(Canvas):

    def __init__(self, parent = None, **options):
        Canvas.__init__(self, parent, options)
        self.box = self.create_rectangle(0, 0, 300, 300,fill="blue")
        self.bind('<Button-1>', self.on_clicked)
        self.tag_bind(self.box, '<B1-Motion>', self.on_clicked)  

    def on_clicked(self, event):
        print( "inner method called")

#now outside this class:
def my_callback(event=None):
    print ("outer method called")

root = Tk()
my_widget = MyCustomWidget()
my_widget.event_add('<<my_event>>', '<B1-Motion>', '<Button-1>')
my_widget.bind('<<my_event>>', my_callback)
my_widget.pack()
root.mainloop()
但当我单击蓝色框
(Button-1)
时,它只调用内部方法,输出为:

inner method called

我希望在这两种情况下都能调用这两种方法。关于为什么会这样做,有什么解释吗?

Tkinter不会为同一事件调用两次回调。从正式的tk文件:

如果多个绑定与特定事件匹配,并且它们具有相同的标记,则选择最特定的绑定并计算其脚本。以下测试用于确定几个匹配序列中哪一个更为具体:

a) 指定特定按钮或键的事件模式比不指定按钮或键的事件模式更具体

(b) 较长的序列(就匹配的事件数量而言)比较短的序列更具体

(c) 如果一个模式中指定的修改器是另一个模式中修改器的子集,则具有更多修改器的模式更具体

(d) 物理模式与序列匹配的虚拟事件的特定性低于与虚拟事件无关的同一物理模式

(e) 给定与两个或多个虚拟事件匹配的序列,将选择其中一个虚拟事件,但顺序未定义

当您单击鼠标按钮时,您有多个匹配的绑定——
上的绑定和
上的绑定。
的绑定比
上的绑定更具体,因此选择了这个绑定

inner method called