当鼠标悬停在窗口上时在 Tkinter 中显示按钮

问题描述 投票:0回答:2

当鼠标悬停在窗口上时,我在显示按钮时遇到问题。当我越过窗口时,按钮就会出现。但当我点击按钮时,它又隐藏了。然而,当我尝试用一个简单的程序重现问题时,它工作得很好......但是在简短的版本中还有其他一些问题让我烦恼。

import Tkinter as TK

root = TK.Tk()
root.geometry("400x300")
root.overrideredirect(True)

button = TK.Button(root, text = "HI", command = lambda: root.destroy())

def Show(event):
    button.place(x = 0, y = 0, width = 60, height = 30)

def Hide(event):
    button.place_forget()

root.bind("<Enter>", Show)
root.bind("<Leave>", Hide)

root.mainloop()

这个简短的版本有效。但是当你越过按钮然后离开它时,它就会隐藏起来。即使您仍在根窗口上方。有没有什么简单的方法可以强制按钮在鼠标悬停在根目录上时始终可见?谢谢

python tkinter button mouseover
2个回答
3
投票

Enter
Leave
事件会触发两次(在根窗口和按钮上),因为当您
Enter
按钮小部件时 - 您是
Leave
根,因此要解决问题,您可以检查
widget.master
并在有情况下采取行动没有大师。

try:
    import tkinter as TK
except ImportError:
    import Tkinter as TK

root = TK.Tk()
root.geometry("400x300")
root.overrideredirect(True)
button = TK.Button(root, text="HI", command=root.destroy)


def Show(event):
    print('Show event triggered by %s' % event.widget.__class__)
    print('Master container is %s' % event.widget.master)

    if event.widget.master is None:
        button.place(x=0, y=0, width=60, height=30)


def Hide(event):
    print('Hide event triggered by %s' % event.widget.__class__)
    print('Master container is %s' % event.widget.master)

    if event.widget.master is None:
        button.place_forget()


root.bind("<Enter>", Show)
root.bind("<Leave>", Hide)

root.mainloop()

1
投票

您可以检查鼠标事件是在根框架外部还是内部,并采取相应措施

def Hide(event):
    x, y = event.x, event.y
    x_r, y_r = root.winfo_x(), root.winfo_y()
    if x > x_r + root.winfo_width() or x < x_r or y > y_r + root.winfo_height() or y < y_r:
        button.place_forget()
© www.soinside.com 2019 - 2024. All rights reserved.