当前位置: 首页 > 面试题库 >

python gui事件乱序

桂和同
2023-03-14
问题内容
from Tkinter import *
from tkMessageBox import *

class Gui:
 def __init__(self, root):
  self.container = Frame(root)
  self.container.grid()
  self.inputText = Text(self.container, width=50, height=8)
  self.outputText = Text(self.container, width=50, height=8, bg='#E0E0E0', state=DISABLED)
  self.inputText.grid(row=0, column=0)
  self.outputText.grid(row=0, column=1)

  self.inputText.bind("<Key>", self.translate)

 def translate(self, event):
  input  = self.inputText.get(0.0, END)
  output = self.outputText.get(0.0, END)

  self.outputText.config(state=NORMAL)
  self.outputText.delete(0.0, END)
  self.outputText.insert(INSERT, input)
  self.outputText.config(state=DISABLED)

  showinfo(message="Input: %s characters\nOutput: %s characters" % (len(input), len(input)))


root = Tk()   #toplevel object
app = Gui(root)  #call to the class where gui is defined
root.mainloop()  #enter event loop

我在tkinter的gui上工作时,对于事件处理程序的运行顺序有些困惑。如果运行上面的代码,您将希望看到…

1)编辑文本窗口小部件会触发事件处理程序,但似乎会在不注册实际更改的情况下将其触发,2)即使清除了文本窗口小部件(即继续按BackSpace键),它似乎仍具有一个字符长度的字符串,
3)尽管数据来自上一个事件,但在触发NEXT事件触发器时,输出窗口小部件仅接收其更新。

这是绑定在tkinter中的工作方式,还是我在这里缺少什么?

更新输入小部件时我想要的行为是:1)显示更改,2)输入事件处理程序,3)更新输出小部件,4)显示消息框。


问题答案:

绑定就是这样工作的(这是一件好事),但是您的问题很容易解决。

绑定按窗口小部件绑定标签(也称为绑定标签或bindtags)指定的顺序触发。除非另有说明,否则绑定将按以下顺序进行:

  1. 如果直接在窗口小部件上有绑定,它将在其他任何绑定之前触发。
  2. 如果小部件的类上有绑定,则下一步将其触发
  3. 如果在包含该窗口小部件的顶级窗口小部件上存在绑定,则将其触发(注意:在此上下文中,根窗口被视为顶层窗口)
  4. 如果对“全部”有约束力,它将在下一个触发。

可以通过事件处理程序之一在任何时候停止该序列,但是在此特定讨论之外。

在默认情况下,您的绑定<Key>发生在类绑定之前,并且实际上是将文本实际插入到小部件中的类绑定。这就是为什么绑定似乎总是落后一个字符的原因。

通常,这种情况的顺序是完全正确的,因为更具体的绑定有机会覆盖默认行为。如果不是这种方式,即使您不想要它,也总是会得到默认行为。当您想增加默认绑定而不是替换默认绑定时,这并不是您总是想要的。

您可以交换绑定标签的顺序,以便首先进行类绑定。或者,向您的文本小部件添加一个附加的绑定标签,并在类绑定之后按顺序添加它,然后进行绑定。通常,添加绑定标记是更好的解决方案,但并非总是如此。

要更改绑定标签,您可以执行以下操作:

self.inputText.bindtags(((str(self.inputText)), "Text", "post-insert", ".", "all"))

要绑定到“插入后”,请使用bind_class方法

self.inputText.bind_class("post-insert", "<Key>", self.translate)

看起来似乎很奇怪,但是绑定标签是最强大的绑定机制之一。它们使您可以完全而完全地控制绑定的顺序,而使用任何其他工具包则要困难得多。

顺便说一句,不要忘了,如果您将所有字符都放在文本小部件的末尾,那么末尾总会有一个额外的换行符。转到end-1c,或从文本中删除一个换行符。



 类似资料:
  • 我使用Drools fusion处理实时事件。每个事件都有一个时间戳字段。问题是,有时事件可能会无序。drools fusion能处理这种情况吗?如果是,如何处理? 谢啦

  • 问题内容: 我使用Python编写代码,我非常喜欢Notepad 。但是,当我使用制表符进行缩进时,在Notepad 中看起来很晚,但是当我运行该程序时,出现了缩进错误,并且当我在Emacs中检查代码时,我发现Notepad ++实际上增加了比制表符更多的空格。它显示在屏幕上。怎么了? 问题答案: 没有通用的制表符大小,因此我始终确保用空格替换制表符(因此您知道所看到的就是在其他任何地方都可以看到

  • 事件 事件,就是文档与浏览器发生特定的 交互瞬间。JavaScript与HTML之间的交互就是通过事件实现的。 事件流 所谓事件流,就是接收页面事件的顺序。 事件流分 事件冒泡流 与 事件捕获流。事件冒泡流是IE开发团队提出的,捕获流是Netscape开发团队提出的。 事件冒泡流 所谓事件冒泡,就是事件开始时由 最具体的元素(文档中嵌套最深的那个 节点)接收,然后逐级向上传播到较为不具体的节点(文

  • 因此,我试图在Laravel框架内与旧的文件上传做斗争,但有点迷失了方向。我已经设法让上传工作,所以文件上传并保存到一个随机字符串名的资产文件夹。 这是表格: 这是路线: 这是AccountController内部的方法: 我现在试图启用,以推动字符串名称到数据库,也与上传它的用户相关联,并显示为他们的个人资料图像?Ay指针会很棒! 我在数据库中创建了一行名为文件的文本类型......我不确定在这

  • 很多企业在使用诸葛io时,会采集和分析数量非常多(可能会多达几百上千)的用户行为事件。这时,事件查找和组织就变得不够方便。 为此,诸葛io提供了事件分组和重要事件(星标事件)标注功能,当事件很多时,可以对事件进行分门别类地管理。同时,可以从产品业务角度将重要的用户行为标注出来,以便可以在分析时方便、快捷地查找常用、重要的事件。 一、使用场景 1. 在众多事件中,方便、快捷地查找重要事件 在分析过程

  • 问题内容: 我正在寻找有关SQL Server日志文件的一些信息。我有一个大型数据库(2GB),最近由于任何原因都没有进行备份。数据库的日志文件增长到11GB左右,据我了解,这是数据库中发生的所有事务和语句。 我的问题: 是什么导致数据库日志文件被刷新?“冲洗”实际上是什么意思?在大型日志文件上执行文件压缩或数据库压缩有什么后果? 问题答案: 备份事务日志后,这些事务将从日志中被截断,但是该操作使