使框架在未聚焦时消失

Make frame disappear when it is not in focus

我试图让框架在未聚焦时消失,例如,如果在框架以外的任何地方单击鼠标,框架就会消失。

就像弹出菜单一样,虽然我不想使用弹出菜单。

代码如下:

from tkinter import *

root = Tk()
root.geometry('700x700')

b = Button(root, text='Show Frame',command=lambda: showlabel())
b.pack()
l = Frame(width=200,height=200,bg='black')
l.bind("<FocusOut>", l.pack_forget())


def showlabel():
    l.pack()


root.mainloop()

<FocusOut>指的是键盘焦点。然而,这听起来不是你的意思,因为框架通常没有键盘焦点。

如果您尝试模拟弹出窗口 window 或消息框,一种方法是在 window 上添加 grab,然后添加一个当您在 window.

之外单击时检测到的绑定

A grab 是一种将所有事件集中到 window 及其子项的方法。这很方便,因为您不希望用户在弹出窗口 window 可见时与窗口小部件进行交互。例如,如果 window 已经可见,您不希望单击 Show Frame 按钮打开另一个 window。

创建框架后,您可以在框架上调用 grab_set。然后,您可以在框架上添加绑定,即使用户在框架外单击,绑定也会触发。在绑定中,您可以检查绑定是在内部还是外部,如果点击在外部,则隐藏 window。

解决方案看起来像这样:

def showlabel():
    def dismiss(event):
        if not ((0 <= event.x <= l.winfo_width()) and (0 <= event.y <= l.winfo_height())):
            l.grab_release()
            l.pack_forget()

    l.pack(pady=20)
    l.bind("<1>", dismiss)
    l.grab_set()

这会更好地实现为 class,但这给出了一个总体思路。