2010-03-16 78 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