2016-09-17 22 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) 

它有点笨,它不是最好的,但它只是意味着当你悬停它为恢复它,在这种情况下,“”事件是什么它的意思,然后听。

相关问题