【问题标题】:python gui events out of orderpython gui事件乱序
【发布时间】:2011-01-28 07:39:00
【问题描述】:
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) 显示消息框。

【问题讨论】:

    标签: python user-interface events tkinter


    【解决方案1】:

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

    绑定按小部件绑定标签(也称为绑定标签或绑定标签)指定的顺序触发。除非您另外指定,否则绑定按以下顺序发生:

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

    事件处理程序之一可以在任何时候停止序列,但这与本次具体讨论无关。

    在默认情况下,&lt;Key&gt; 上的绑定发生在类绑定之前,它是文本实际插入到小部件的类绑定。这就是为什么你的绑定似乎总是落后一个字符。

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

    您可以交换绑定标签的顺序,以便首先发生类绑定。或者,向您的文本小部件添加一个额外的绑定标签,并将其添加到类绑定之后的序列中,然后绑定到它。通常添加绑定标签是更好的解决方案,但并非总是如此。

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

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

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

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

    这可能看起来很奇怪,但绑定标签是目前最强大的绑定机制之一。它们使您可以完全控制绑定的顺序,这对于任何其他工具包来说都更加困难。

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

    【讨论】:

    • 感谢您花时间输入 Bryan,解释了很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多