鼠标悬停时在 Tkinter 中显示按钮 window

Show button in Tkinter when mouse is over window

当鼠标悬停在 window 上时,我无法显示按钮。当我浏览 window 时,该按钮出现。但是当我越过按钮时,它又隐藏了。然而,当我尝试用一​​个简单的程序重现问题时,它工作正常......但在简短的版本中还有其他问题让我烦恼。

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()

这个简短的版本有效。但是当你越过按钮然后离开它时,它就会隐藏起来。即使你还在根window之上。是否有任何简单的方法可以强制按钮始终在鼠标位于根目录上时可见?谢谢

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

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()

EnterLeave 事件触发两次(通过根 window 和按钮),因为当您 Enter 按钮小部件 - 您 Leave root,解决问题可以查看widget.master,如果没有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()