在这篇文章的给定示例中,提到如果使用默认绑定标记,则事件值在定义内部将不可见(将滞后一个)。
关于类绑定有一些解释。 我是一个初学者,所以想了解详细的原因。 能否请你解释一下为什么它在第一种情况下不起作用而在第二种情况下(修改绑定标签的顺序时)为何起作用。
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(...),实际发生的是绑定与具有与小部件相同名称的绑定标签相关联。
mywidget.bind(...)
当检测到事件时,Tkinter首先确定哪个窗口小部件拦截了该事件。该窗口小部件将具有与之关联的零个或多个(默认值:四个)绑定标签的列表。Tkinter将检查每个标签,以查看是否存在与事件匹配的绑定。如果找到一个,它将执行绑定,然后继续执行下一个标记,直到用完标记或绑定的函数之一返回string为止"break"。
string
"break"
该序列如下所示:
是类绑定,它将一个字符从内存中的事件对象复制到窗口小部件,从而使它出现在屏幕上。在类绑定触发之前,角色将不会出现在小部件中。类绑定之后,它将在小部件中。