在tkinter中检测帧的`<enter>`和`<leave>`事件

时间:2016-09-17 21:19:39

标签: python tkinter

我有一个菜单,当用户将鼠标移开时我想要消失。该菜单包含一个Frame,其中包含多个Label / Button个小部件。我可以检测到用户将鼠标从Label / Button移开,只需绑定<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())

2 个答案:

答案 0 :(得分:0)

如果您只是想简化小部件上回调的维护,那么我不认为绑定事件到包含框架是最好的方法。 (我想它可以在按钮和标签的回调中生成虚拟事件,并将虚拟事件绑定到帧,但它似乎相当复杂。也许这只是因为我没有经验虚拟事件。)

为什么不直接对标签和按钮小部件进行子类化?查看&#34;实例和类绑定&#34;标题为http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm然后你只需要维护两个类绑定,一个用于标签,一个用于按钮。这对我来说似乎更清洁;它只是香草OOP。

希望这有帮助。

答案 1 :(得分:0)

我找到了一个简单的方法来解决你想要做的事情,我试图做同样的事情!

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

它有点愚蠢,它不是最好的,但它只是意味着当你悬停时它会执行它的意思,然后侦听恢复它的事件,在这种情况下''。