关于 tkinter 中的 bindtags 的基本查询
- 2024-12-09 08:30:00
- admin 原创
- 136
问题描述:
在这篇文章给出的例子中,提到如果使用默认的绑定标签,那么事件值将不会在定义中可见(将会滞后一个)。
有一些关于类绑定的解释。
我是初学者,所以想了解详细的原因。
有人能解释一下为什么它在第一种情况下不起作用,而在第二种情况下起作用吗(当修改绑定标签的顺序时)。
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()
解决方案 1:
当您对小部件进行绑定时,您实际上并没有绑定到小部件本身。当您这样做时mywidget.bind(...)
,实际发生的事情是绑定与与小部件同名的绑定标记相关联。
当检测到事件时,Tkinter 首先确定哪个小部件拦截了该事件。此小部件将具有与之关联的零个或多个(默认情况下为四个)绑定标签的列表。Tkinter 将检查每个标签以查看是否有与事件匹配的绑定。如果找到一个,它将执行绑定,然后继续执行下一个标签,直到用完标签或其中一个绑定函数返回字符串"break"
。
该序列看起来像这样:
你按下“x”键。此时“x”还没有插入到任何地方
Tkinter 获取具有键盘焦点的小部件的绑定标签。
默认情况下,第一个绑定标签是小部件本身。该标签上是否有绑定?如果有,请执行它。例如,您可以打印小部件的内容。由于尚未触发其他绑定,因此“x”不会成为内容的一部分。
如果绑定函数返回
"break"
,则不再进行事件处理。“x”将不会插入到小部件中。如果小部件没有返回
"break"
,tkinter 将继续执行下一个绑定标签。默认情况下,下一个绑定标签是小部件类。类上是否有与此事件(按下字母“x”)匹配的绑定?
在这种情况下,该类确实具有此事件的绑定,即实际将“x”插入到小部件中。到目前为止,“x”仍未插入到小部件中。 但是,在此绑定之后,如果您打印内容,您将看到“x”
处理以此方式继续,直到所有绑定标签都已处理。
根据评论部分正在进行的讨论,似乎这一点仍不清楚。我会尽量让它尽可能简单:
类绑定将字符从内存中的事件对象复制到小部件,从而使其出现在屏幕上。在类绑定触发之前,该字符不会出现在小部件中。类绑定之后,它将出现在小部件中。