【问题标题】:Show button in Tkinter when mouse is over window当鼠标悬停在窗口上时在 Tkinter 中显示按钮
【发布时间】:2017-08-15 14:20:23
【问题描述】:

当鼠标悬停在窗口上时,我在显示按钮时遇到问题。当我越过窗口时,按钮就会出现。但是当我越过按钮时,它又隐藏了。然而,当我试图用一个简单的程序重新创建问题时,它工作正常......但在简短的版本中还有其他问题。

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

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

【问题讨论】:

    标签: button tkinter mouseover


    【解决方案1】:

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

    【讨论】:

    • 这个解决方案很好。
    【解决方案2】:

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

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

    【讨论】:

    • event.xevent.y 在窗口本身...所以我不得不将其更改为 if x &gt; root.winfo_width() or x &lt; 0 or y &gt; root.winfo_height() or y &lt; 0:
    • x_r 和 y_r 在 root.overrideredirect(True) 时应该为 0,所以我不明白你的意思。不是和我发布的一样有效吗?我使用的是 python 3.6,所以这里可能有所不同。
    • 是的,对不起,我忘了提到在原始程序中我做了一些函数来移动窗口。将其从原始位置移动后,隐藏功能不再起作用。我使用 python 2.7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多