正在为tkin中的帧检测“<Enter>”和“<Leave>”事件

2024-10-01 15:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个菜单,当用户移动鼠标时,我想消失。菜单由一个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())

Tags: lambdanamebindtkinter事件鼠标framelabel
2条回答

我找到了一个简单的方法来解决你想做的事情,我也在试着这么做!在

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

它有点愚蠢,它不是最好的,但它只是意味着当你悬停时,它会做它想做的事情,然后监听还原它的事件,在本例中是“”。在

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

为什么不将标签和按钮小部件子类化呢?看一下位于http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm的“实例和类绑定”标题,那么您只需要维护两个类绑定,一个用于标签,一个用于按钮。这对我来说似乎更干净,只是香草味的哦。在

希望这有帮助。在

相关问题 更多 >

    热门问题