2016-09-17 43 views
-1

我有一個菜單,當用戶將鼠標移開時,我想消失。該菜單包含一個Frame,其中包含幾個Label/Button小部件。我可以檢測到用戶將他們的鼠標移出Label/Button,只需綁定這些事件的<Enter>/<Leave事件即可。但綁定到框架的相同事件從不觸發 - 我猜是因爲頂部的小部件掩蓋了框架,所以鼠標永遠不會進入它?檢測'<Enter>`和`<Leave>`在tkinter中的幀事件

他們的方式是讓事件傳播到包含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處查看「實例和類綁定」標題然後,您只需要維護兩個類綁定,一個用於標籤,另一個用於按鈕。這對我來說似乎更清潔。這只是香草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) 

它有點笨,它不是最好的,但它只是意味着當你懸停它爲恢復它,在這種情況下,「」事件是什麼它的意思,然後聽。

相關問題