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



当鼠标悬停在窗口上时,我在显示按钮时遇到问题。当我越过窗口时,按钮出现了。但是当我越过按钮时,它又隐藏了。但是,当我尝试使用简单的程序重现问题时,它工作正常......但是在简短版本中还有其他事情困扰着我。

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

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

EnterLeave事件触发两次(在根窗口和按钮上),因为当您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()

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

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

相关内容

  • 没有找到相关文章

最新更新