9

这篇文章的给定示例中,提到如果使用默认绑定标签,则事件值将在定义中不可见(会有一个滞后)。

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

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()
4

1 回答 1

23

当您对小部件进行绑定时,您实际上并没有绑定到小部件本身。当您这样做时mywidget.bind(...),实际发生的是绑定与与小部件同名的绑定标记相关联。

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

序列看起来像这样:

  1. 你按下“x”键。此时“x”尚未插入任何地方
  2. Tkinter 获取具有键盘焦点的小部件的绑定标签。
  3. 默认情况下,第一个绑定标签是小部件本身。该标签上有绑定吗?如果是,执行它。例如,您可以打印小部件的内容。因为尚未触发其他绑定,所以“x”不会成为内容的一部分。
  4. 如果绑定函数返回"break",则不再进行事件处理。“x”不会插入到小部件中。
  5. 如果小部件没有返回"break",tkinter 继续下一个绑定标签。
  6. 默认情况下,下一个绑定标签是小部件类。类上是否有与此事件匹配的绑定(字母“x”的按键)?
  7. 在这种情况下,该类确实具有此事件的绑定,即实际将“x”插入到小部件中。直到此时,“x”仍未插入到小部件中。但是,在此绑定之后,如果您打印了内容,您会看到“x”
  8. 以这种方式继续处理,直到处理完所有绑定标签。

根据评论部分正在进行的讨论,这似乎仍不清楚。我会尽量简化:

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

于 2012-07-18T13:10:32.263 回答