关于tkinter中bindtags的基本查询

sar*_*jit 5 python tkinter

这篇文章的给定示例中,有人提到如果使用默认的bindtags,那么事件值在定义内部将不可见(将滞后一个).

关于类绑定有一些解释.
我是初学者,所以想了解详细原因.
有些人可以解释为什么它在第一种情况下没有工作并且在第二种情况下工作(当修改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()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 14

在窗口小部件上执行绑定时,实际上并不是绑定到窗口小部件本身.当你这样做时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. 处理以这种方式继续,直到处理完所有绑定标记.

根据评论部分正在进行的讨论,似乎仍然不清楚.我会尝试尽可能简单:

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

  • @sarbjit:你写的是错误的。你把事情复杂化了。当类绑定被触发时,该字符被插入到小部件中。没有“内存中”副本或“pvs”(以前的?)值有问题。在类绑定之前,字符不在小部件中。在类绑定之后,它是。就是这么简单。 (2认同)