关于tkinter中的bindtags的基本查询

在这篇文章给出的例子中,有人提到,如果使用默认的绑定标签,那么事件的值在定义里面是不可见的(会有一个滞后)。

关于类绑定有一些解释。
我是初学者,所以想了解详细的原因。
有些人可以解释为什么它不是在第一种情况下工作,并在第二种情况下工作(当绑定标签的顺序被修改时)。

import Tkinter def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) root = Tkinter.Tk() entry1 = Tkinter.Entry(root, name="entry1") entry2 = Tkinter.Entry(root, name="entry2") entry3 = Tkinter.Entry(root, name="entry3") entry1.bindtags(('.entry1', 'Entry', '.', 'all')) entry2.bindtags(('Entry', '.entry1', '.', 'all')) entry3.bindtags(('.entry1','Entry','post-class-bindings', '.', 'all')) btlabel1 = Tkinter.Label(text="bindtags: %s" % " ".join(entry1.bindtags())) btlabel2 = Tkinter.Label(text="bindtags: %s" % " ".join(entry2.bindtags())) btlabel3 = Tkinter.Label(text="bindtags: %s" % " ".join(entry3.bindtags())) status = Tkinter.Label(anchor="w") entry1.grid(row=0,column=0) btlabel1.grid(row=0,column=1, padx=10, sticky="w") entry2.grid(row=1,column=0) btlabel2.grid(row=1,column=1, padx=10, sticky="w") entry3.grid(row=2,column=0) btlabel3.grid(row=2,column=1, padx=10) status.grid(row=3, columnspan=2, sticky="w") entry1.bind("<KeyPress>", OnKeyPress) entry2.bind("<KeyPress>", OnKeyPress) entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress) root.mainloop() 

当你在一个小部件上进行绑定时,你实际上并没有绑定到一个部件本身。 当您执行mywidget.bind(...) ,实际发生的事情是该绑定与具有该小部件相同名称的绑定标记关联。

当检测到事件时,Tkinter首先找出哪个小部件拦截了事件。 这个小部件将有一个零个或多个(默认情况下是四个)与之关联的绑定标签。 Tkinter会检查每个标签,以查看是否存在与事件匹配的绑定。 如果find,它将执行绑定,然后继续下一个标记,直到标记用完,或者其中一个绑定函数返回string"break"

序列看起来像这样:

  1. 你按下“x”键。 此时“x”没有插入任何地方
  2. Tkinter获取具有键盘焦点的小部件的绑定标签。
  3. 默认情况下,第一个绑定标签是小部件本身。 那个标签有绑定吗? 如果是这样,执行它。 例如,您可能会打印小部件的内容。 由于没有其他绑定已经被解雇,“x”不会成为内容的一部分。
  4. 如果绑定函数返回"break"则不再执行事件处理。 “x”不会被插入到小部件中。
  5. 如果小部件没有返回"break" ,tkinter继续下一个绑定标签。
  6. 默认情况下,下一个绑定标记是小部件类。 是否有匹配此事件的类(字母“x”的按键)的绑定?
  7. 在这种情况下,这个类确实有这个事件的绑定,这实际上是将“x”插入到小部件中。 在此之前,“x”还没有被插入到小部件中 。 然而,在这个绑定之后,如果你做了一个内容的打印,你会看到“x”
  8. 处理以这种方式继续,直到所有的绑定标签都被处理完毕。

根据评论部分正在进行的讨论,似乎还不清楚。 我会尽可能简单地做到这一点:

它是从内存中的事件对象复制一个字符到窗口小部件,从而使它出现在屏幕上的类绑定。 在类绑定触发之前,angular色将不会出现在小部件中。 类绑定后,它将在小部件。