2016-09-17 18 views
-1

ユーザーがマウスを離したときに消えたいメニューがあります。メニューは、に数個のLabel/Buttonウィジェットが含まれています。私はLabel/Buttonからマウスを動かしているユーザーを検出して、それらのイベントの<Enter>/<Leaveに単純にバインドして検出できます。しかし、フレームのための同じイベントへのバインディングは決して誘発しない - 私は、上のウィジェットがフレームを覆い、マウスがそれに入ることはないので推測する?tkinterのフレームに「<Enter>」と「<Leave>」イベントが検出されました

これらのイベントは、含まれているイベントに伝播させる方法ですか。Frame

window=tkinter.Tk() 
menu_frm = tkinter.Frame(window, name="menu_frm") 
lbl_1 = tkinter.Label(menu_frm, text="Label", name="lbl_1") 
lbl_1.pack() 
lbl_2 = tkinter.Label(menu_frm, text="Label", name="lbl_2") 
lbl_2.pack() 
menu_frm.pack() 
# These two (per label and the number of labels is likely to grow) events fire 
lbl_1.bind("<Enter>", lambda _: stayopenfunction()) 
lbl_1.bind("<Leave>", lambda _: closefunction()) 
lbl_2.bind("<Enter>", lambda _: stayopenfunction()) 
lbl_2.bind("<Leave>", lambda _: closefunction()) 
# These two events do not fire 
menu_frm.bind("<Enter>", lambda _: stayopenfunction()) 
menu_frm.bind("<Leave>", lambda _: closefunction()) 
+0

コードスニペットを送信すると役立ちます。 –

+0

ラベルが完全にフレームをカバーしている場合、なぜフレームにバインドする必要があるのか​​わかりません。何が起こりたくないのですか?私は実際にいくつかのラベル/ボタンを持っています(まだ両方のタイプが必要なのかどうかは決まっていません)。そして、あなたはバインド構文を簡略化することができます: 'lbl_1.bind(" stayopenfunction) ' – saulspatz

+0

@saulspatzこれらのイベントはそれぞれのイベントにバインドする必要があります。つまり、呼び出される関数を変更したい場合は、すべてのイベントを変更する必要があります。 – Kvothe

答えて

0

あなただけのウィジェットのコールバックのメンテナンスを簡素化しようとしている場合は、私が含むフレームにイベントを結合することは最善のアプローチであるとは思いません。 (私はボタンやラベルのコールバックで仮想イベントを生成し、仮想イベントをフレームにバインドすることは可能だと思いますが、それはむしろ複雑なようです。なぜ、ラベルとボタンのウィジェットをサブクラス化しないのですか? http://effbot.org/tkinterbook/tkinter-events-and-bindings.htmの「インスタンスとクラスのバインディング」の見出しで、ラベル用とボタン用の2つのクラスバインディングを維持するだけです。これは私にとってはより清潔です。それはちょうどバニラOOPです。

これが役に立ちます。

+0

これは私が探していたものに最も近いものです。実際には、クリックがメニューから外れた場合にメニューを閉じるために、イベントをメインウィンドウに割り当てることになりました。したがって、ユーザーが外出するのではなく、外に出たとき(Windowsの[スタート]ボタンのように)にメニューが閉じるので、 – Kvothe

0

あなたのやろうとしていることを簡単に修正しました。同じことをやろうとしていました。

def function2(event): 
    -revert event- 
    Widget.bind("<Enter>", function1) 
def function1(event): 
    -hover event- 
    Widget.bind("<Leave>", function2) 
Widget.bind("<Enter>", function1) 

ビット愚かその、その最高ではないが、それは単に「」あなたが置くと、そのはに何を意味するのかないことを意味し、この場合には、それを戻りイベントをリッスンします。

関連する問題