2010-03-16 75 views
1
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我对于事件处理程序运行的顺序有点困惑。如果你运行上面的代码,你会希望看到...python gui events out of order

1)编辑文本小部件会触发事件处理程序,但它似乎没有注册实际更改而关闭它, 2)即使当文本小部件清除(即继续按BackSpace),它似乎仍然有一个字符长度的字符串, 3)输出小部件只在NEXT事件触发器被触发时才接收其更新,尽管事实上数据出现在上一个事件上。

这只是如何绑定tkinter工作或我在这里失踪的东西?

更新所述输入窗口小部件时,我想的行为是: 1)显示的变化, 2)输入的事件处理程序, 3)更新输出插件, 4)显示消息框。

回答

4

这是如何绑定工作(这是一件好事),但你的问题很容易解决。

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

  1. 如果直接绑定到小部件上,它将在任何其他绑定之前触发。
  2. 如果小部件的某类产品的绑定,则接下来发射
  3. 如果在包含插件的顶层窗口小部件的绑定,它被触发下一个(注:根窗口被认为是一个顶层窗口这种情况下)
  4. 如果有一个绑定的“全部”它将接下来会触发。

序列可以由任何一个事件处理程序在任何点停止,但这不在这个特定的讨论中。

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

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

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

要改变bindtags你可以做这样的事情:

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

绑定到“后插入”,与bind_class方法做到这一点:

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

似乎有些奇怪,但绑定标签是那里最强大的绑定机制之一。它们可以让你完全控制绑定的顺序,这对任何其他工具包来说都要困难得多。

顺便说一句,不要忘记,如果你把所有的字符都放到了文本小部件的末尾,那么最后总会有一个额外的换行符。要么到达end-1c,要么从文本中删去一个换行符。

+0

感谢您抽出宝贵的时间输入Bryan,很多人解释说。 – dave 2010-03-21 14:17:50