当前位置: 首页 > 知识库问答 >
问题:

关于tkinter中bindtags的基本查询

高恺
2023-03-14

在本文给出的示例中,提到如果使用默认BindTag,那么事件值在定义中将不可见(将有一个延迟)。

关于类绑定有一些解释<我是初学者,所以想了解详细的原因
请解释为什么它在第一种情况下不起作用,而在第二种情况下起作用(当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()

共有1个答案

程成天
2023-03-14

在小部件上进行绑定时,实际上并不是绑定到小部件本身。当您执行mywidget时。绑定(…) ,实际发生的是绑定与与小部件同名的绑定标记相关联。

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

序列如下所示:

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

根据评论部分正在进行的讨论,这似乎还不清楚。我将尽可能简单地做到这一点:

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

 类似资料:
  • 问题内容: 在这篇文章的给定示例中,提到如果使用默认绑定标记,则事件值在定义内部将不可见(将滞后一个)。 关于类绑定有一些解释。 我是一个初学者,所以想了解详细的原因。 能否请你解释一下为什么它在第一种情况下不起作用而在第二种情况下(修改绑定标签的顺序时)为何起作用。 问题答案: 当你对窗口小部件进行绑定时,实际上并没有绑定到窗口小部件本身。当你这样做时,实际发生的是绑定与具有与小部件相同名称的绑

  • 本文向大家介绍Python基于Tkinter实现的记事本实例,包括了Python基于Tkinter实现的记事本实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python基于Tkinter实现的记事本。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 在开始部分,请看官非常非常耐心地阅读下面几个枯燥的术语解释,本来这不符合本教程的风格,但是,请看官谅解,因为列位将来一定要阅读枯燥的东西的。这些枯燥的属于解释,均来自维基百科。 1、问题空间 问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已贮存的信息主动地构成的。 一个问题一般有下面三个方面来定义: 初始状态——一开始时的不完全的信息或令人不满意的状况;

  • 本文向大家介绍Python基于Tkinter的HelloWorld入门实例,包括了Python基于Tkinter的HelloWorld入门实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python基于Tkinter的HelloWorld入门实例。分享给大家供大家参考。具体分析如下: 初学Python,打算做几个Tkinter的应用来提高。 刚学的HelloWorld,秀一下。我用Py

  • 我正在使用spring-data、QueryDSL和MySQL。 返回所有包含姓名的员工(在first_name和last_name中),并从该结果中获得的证书在2014年12月22日至2015年12月22日之间 我尝试了它,但无法获得如何以QueryDSL方式迭代每个员工的每个证书并返回员工列表。 您的回应将非常感谢!!

  • 我在半年多前开始学习使用Python编程语言。正如Swaroop在本书中所说的那样,它很快就成为“我最喜欢的编程语言”。目前我的几乎所有编程工作都使用Python。从我的切身体会来说,Python最大的特点就是易懂、易用、高效率。我相信,如果你已经学完了本书,并且尝试着编写了一些程序后,你一定会有相同的感受。 Swaroop C. H.的这本书是我学习Python时的第一本教材。它简单明晰,可以在