一尘不染

Python-关于Tkinter中的绑定标签的基本查询

python

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

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

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

阅读 841

收藏
2020-02-19

共1个答案

一尘不染

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

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

该序列如下所示:

  1. 你按“ x”键。此时,“ x”尚未插入任何位置
  2. Tkinter获取具有键盘焦点的小部件的绑定标签。
  3. 默认情况下,第一个绑定标签是小部件本身。该标签上有绑定吗?如果是这样,请执行它。例如,你可以打印窗口小部件的内容。因为尚未触发其他绑定,所以“ x”将不属于内容。
  4. 如果绑定的函数返回,”break”则不再进行事件处理。“ x”将不会插入到小部件中。
  5. 如果窗口小部件未返回”break”,则tkinter进入下一个绑定标记。
  6. 默认情况下,下一个绑定标签是小部件类。在与该事件匹配的类上是否存在绑定(按字母“ x”的键)?
  7. 在这种情况下,该类确实具有此事件的绑定,该绑定实际上是将“ x”插入到小部件中。到目前为止,“ x”仍未插入小部件中。但是,在此绑定之后,如果你打印了内容,则会看到“ x”
  8. 以这种方式继续处理,直到所有绑定标签都已处理完毕。
    根据评论部分中正在进行的讨论,似乎还不清楚。我将尝试使其尽可能简单:

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

2020-02-19