2016-02-12 74 views
0

在下面的代碼中,我將鍵綁定到文本小部件。根據綁定完成的方式,當在窗口小部件中鍵入「x」時,我會得到不同的結果。不同的方式綁定不同的結果?

爲什麼bind和bind_all之間的輸出有差異? 我應該如何使用所有三種變體,以便它們都能得到相同的結果?

import tkinter as tk 

class Q_bind(tk.Text): 
    def __init__(self): 
     tk.Text.__init__(self) 

     self.bind("<Key>", self._insert_a) #-> 'a\nx' with break a! 
     #self.bind_class("<Key>", self._insert_a) # -> 'x' Replace with: 
     #self.bind_class("Text", "<Key>", self._insert_a) # -> 'a'!! 
     #self.bind_all("<Key>", self._insert_a) # -> 'xa\n' 
     print(self.bindtags())   #shows the bind-tags 

    def _insert_a(self, event=None): 
     print(event.char) 
     self.insert('end' ,"a\n") 
     return 'break'    #added 

if __name__ == "__main__": 
    app = Q_bind() 
    app.pack(fill="both", expand='y') 
    app.master.geometry('400x400') 
    app.mainloop() 
+0

不同的綁定用於不同的目的,它們以不同的方式工作(它們可以在'mainloop'檢查綁定時在不同的時刻執行)。 http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm – furas

+1

btw:它應該是'self.bind_class(「Text」,「」,self._insert_a)' - 類名稱爲「Text」 – furas

+2

這是否回答你的問題? http://stackoverflow.com/a/11542200/7432 –

回答

1

您不能使用所有這三個綁定,並得到同樣的結果因爲結果取決於部件綁定標籤的排序。

每個小部件都有一組有序的綁定標籤。綁定實際上是附加到這些標籤,而不是實際的小部件。只是碰巧第一個綁定標籤是小部件的名稱。

默認窗口小部件具有以下順序的下列綁定標籤:

  1. 微件本身
  2. 微件類(內部tk類,不Tkinter的類)
  3. 微件頂層(或根窗口)
  4. 「所有」

當一個事件上的小工具時,以下四件事情發生:

  1. 如果微件具有這樣的情況下,處理該綁定
  2. 如果插件具有該事件相匹配的綁定,處理該綁定
  3. 匹配的結合,如果小組件的頂層(或根)具有與事件相匹配的綁定,如果在「全部」上存在綁定,則處理該事件,處理綁定

在任何時候,如果綁定返回文字字符串"break",則不會處理更多綁定。沒有返回"break",所有四個事件處理程序都被處理。如果您的窗口小部件綁定返回"break",則不會處理類,頂層和「全部」綁定。

在結合<Key>bind_all特定情況下,這是發生了什麼:

  1. 的窗口小部件沒有結合該事件相匹配,所以什麼都不做
  2. Widget類綁定,所以它被處理。在這種情況下該鍵的字母被插入到小工具
  3. widget的頂層/根已經沒有約束力,所以什麼都不做
  4. 「一切」標籤都有一個綁定,它會插入"a\n"

因爲對於"all"綁定發生窗口小部件類的結合,返回"break"沒有任何影響,並不能防止插入一個「A」 除了您的自定義行爲的默認行爲。

綁定標籤是處理事件的非常漂亮的方式。在過去的幾年中,我已經使用了幾種不同語言的至少六種不同的GUI工具包,沒有什麼能夠接近tk的綁定標籤機制的力量。


你居然可以通過添加或刪除綁定標籤,或更改綁定變量的順序得到所有三個相同的行爲。您可以使用bindtag方法執行此操作。很少需要這樣做,但對於一些特殊情況來說,它非常方便。

+0

謝謝@布賴恩的真實解釋,我可以想象這個過程,儘管可能需要更多時間才能真正消化。非常感激。 – ingo