0

我试图让一个框架在它不在焦点时消失,例如,如果在框架之外的任何地方单击鼠标,那么框架应该消失。

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

这是代码:

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

1 回答 1

1

<FocusOut>指键盘焦点。但是,这听起来不是您的意思,因为帧通常没有键盘焦点。

如果您尝试模拟弹出窗口或消息框,一种方法是在窗口上添加抓取,以及检测您在窗口外单击时的绑定。

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

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

解决方案如下所示:

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

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

于 2020-09-10T16:28:02.390 回答