2013-03-12 16 views
5

複数のウィジェットを1つの「バインド」でバインドする方法が不思議です。 expampleについてはTkinterで複数のウィジェットをバインドする方法を教えてください。

私は、次の3つのボタンを持っていると私はホバリングの後に自分の色を変更したいです。

from Tkinter import * 

def SetColor(event): 
    event.widget.config(bg="red") 
    return 

def ReturnColor(event): 
    event.widget.config(bg="white") 
    return 

root = Tk() 

B1 = Button(root,text="Button 1", bg="white") 
B1.pack() 

B2 = Button(root, text="Button2", bg="white") 
B2.pack() 

B3 = Button(root, text= "Button 3", bg="white") 
B3.pack() 

B1.bind("<Enter>",SetColor) 
B2.bind("<Enter>",SetColor) 
B3.bind("<Enter>",SetColor) 

B1.bind("<Leave>",ReturnColor) 
B2.bind("<Leave>",ReturnColor) 
B3.bind("<Leave>",ReturnColor) 

root.mainloop() 

私の目標は、上記の6つではなく、2つのバインド(「Enter」と「Leave」イベント)を持つことです。

は、複数のオブジェクトに同じことをやって任意のアイデア

答えて

5

いただきありがとうございますか!私にループforのように聞こえます。

for b in [B1, B2, B3]: 
    b.bind("<Enter>", SetColor) 
    b.bind("<Leave>", ReturnColor) 

あなたはさらに行くことができるとスニペットの抽象すべて:

for s in ["button 1", "button 2", "button 3"]: 
    b=Button(root, text=s, bg="white") 
    b.pack() 
    b.bind("<Enter>", SetColor) 
    b.bind("<Leave>", ReturnColor) 

今では(単に入力リストに別のエントリを追加します)余分なボタンを追加するのは簡単です。また、ループの本体を変更することで、すべてのボタンに対して行うことを簡単に変更できます。

+0

また、ネストされた辞書を使用してパラメータを設定することもできます: 'bParams = {'button1':{'bg': 'red'、 'command' = self.frame.quit、...}、... } '。あなたが辞書にコマンドを追加できるかどうかは分かりませんが、それ以外の場合、 'b = Button(root、text = s、bg = bParams [b]、...)'とすることができます。 –

+0

ああ、ありがとう。それは働くかもしれない:) –

6

複数のウィジェットに単一のバインディングを適用できるかどうかに関する具体的な質問に答えるには、答えは「はい」です。おそらくコードの行数は少なくて済むでしょうが、それは簡単です。

すべてのtkinterウィジェットには、「バインド・タグ」と呼ばれるものがあります。バインド・タグは、バインディングが添付される「タグ」のリストです。あなたはそれを知らずにこれを常に使用します。ウィジェットにバインドするとき、バインディング自体は実際にウィジェット自体ではなく、ウィジェットの低レベル名と同じ名前のタグにバインドされます。デフォルトのバインディングは、ウィジェットクラス(基本クラス、必ずしもPythonクラスではない)と同じ名前のタグにあります。 bind_allに電話すると、"all"というタグにバインドしています。

バインドタグの素晴らしい点は、必要なタグをすべて追加したり削除できることです。だから、独自のタグを追加して、それにバインディングをbind_classで割り当てることができます(Tkinterの著者がその名前を選んだ理由はわかりません...)。

重要なことは、バインド・タグには順序があり、イベントはこの順序で処理されることです。イベントハンドラが文字列"break"を返した場合、残りのバインドタグのバインドがチェックされる前にイベント処理が停止します。

他のバインディングでこれらの新しいバインディングをオーバーライドできるようにするには、最後にバインドタグを追加します。あなたのバインディングを他のバインディングでオーバーライドすることが不可能にしたい場合は、それを最初に置いてください。 bindtagsについてもう少し情報がこの回答に記載されています

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 

     # add bindings to a new tag that we're going to be using 
     self.bind_class("mytag", "<Enter>", self.on_enter) 
     self.bind_class("mytag", "<Leave>", self.on_leave) 

     # create some widgets and give them this tag 
     for i in range(5): 
      l = tk.Label(self, text="Button #%s" % i, background="white") 
      l.pack(side="top") 
      new_tags = l.bindtags() + ("mytag",) 
      l.bindtags(new_tags) 

    def on_enter(self, event): 
     event.widget.configure(background="bisque") 

    def on_leave(self, event): 
     event.widget.configure(background="white") 

if __name__ == "__main__": 
    root = tk.Tk() 
    view = Example() 
    view.pack(side="top", fill="both", expand=True) 
    root.mainloop() 

例:また

https://stackoverflow.com/a/11542200/7432、それ自体が他の場所の間でeffbot Basic Widget Methodsページに記述されてbindtags方法。

関連する問題