Button 当鼠标位于窗口上方时,在Tkinter中显示按钮

Button 当鼠标位于窗口上方时,在Tkinter中显示按钮,button,tkinter,mouseover,Button,Tkinter,Mouseover,当鼠标位于窗口上方时,我无法显示按钮。当我走过窗户时,按钮就出现了。但当我按下按钮时,它又隐藏了起来。然而,当我试图用一个简单的程序重新创建这个问题时,它工作得很好。。。但在简短的版本中,还有一些东西让我感到不舒服 import Tkinter as TK root = TK.Tk() root.geometry("400x300") root.overrideredirect(True) button = TK.Button(root, text = "HI", command = lam

当鼠标位于窗口上方时,我无法显示按钮。当我走过窗户时,按钮就出现了。但当我按下按钮时,它又隐藏了起来。然而,当我试图用一个简单的程序重新创建这个问题时,它工作得很好。。。但在简短的版本中,还有一些东西让我感到不舒服

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()
将Tkinter作为TK导入
root=TK.TK()
根几何(“400x300”)
root.overrideredirect(True)
button=TK.button(root,text=“HI”,command=lambda:root.destroy())
def显示(事件):
按钮位置(x=0,y=0,宽度=60,高度=30)
def隐藏(事件):
按钮。放置_忘记()
root.bind(“,Show)
root.bind(“,隐藏)
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()
def隐藏(事件):
x、 y=事件.x,事件.y
x_r,y_r=root.winfo_x(),root.winfo_y()
如果x>x\u r+root.winfo\u width()或xy\u r+root.winfo\u height()或y
进入
离开
事件会触发两次(通过根窗口和按钮),因为当您
进入
按钮小部件时,您
离开
根,所以为了解决问题,您可以检查
小部件.主程序
并在没有主程序时采取行动

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()
试试看:
将tkinter作为TK导入
除恐怖外:
将Tkinter作为TK导入
root=TK.TK()
根几何(“400x300”)
root.overrideredirect(True)
button=TK.button(root,text=“HI”,command=root.destroy)
def显示(事件):
打印('Show event由%s'%event.widget.\uuuu class\uuuu\uu触发的事件)
打印('主容器是%s'%event.widget.Master)
如果event.widget.master为无:
按钮位置(x=0,y=0,宽度=60,高度=30)
def隐藏(事件):
打印('隐藏由%s触发的事件''%event.widget.\uuuu class\uuuuuuu)
打印('主容器是%s'%event.widget.Master)
如果event.widget.master为无:
按钮。放置_忘记()
root.bind(“,Show)
root.bind(“,隐藏)
root.mainloop()

event.x
event.
y在窗口本身中。。。因此,如果x>root.winfo_width()或x<0或y>root.winfo_height()或y<0:x_r和y_r在root.overrideredirect(True)时应为0,我不理解你的观点。它不是和我贴的一样有效吗?我使用了Python3.6,所以这里可能有所不同。是的,很抱歉,我忘了提到,在原始程序中,我使用了一些函数来移动窗口。从原来的位置移动后,隐藏功能不再起作用。我使用Python2.7这个解决方案很好。