Python Tk/Tkinter:检测应用程序失去焦点

Python Tk/Tkinter:检测应用程序失去焦点,python,tkinter,tk,Python,Tkinter,Tk,我正在申请一个特金特。在应用程序中,我想弹出一个上下文菜单,我使用Tk.menu.post()来实现 当应用程序失去焦点时,我不知道如何使此菜单消失。我需要这样做,因为即使切换到另一个窗口,菜单仍保持在顶部,留下菜单“工件” 我在菜单上放置了一个事件,如果菜单具有焦点并且用户将焦点移动到另一个应用程序,则会触发该事件。这很有效 如果主应用程序窗口有焦点,我该怎么办?我可以在应用程序窗口上放置一个事件,关闭菜单;但是,当我将焦点放在菜单上时,会调用它,从而关闭菜单。菜单是以父应用程序作为主应用程序

我正在申请一个特金特。在应用程序中,我想弹出一个上下文菜单,我使用Tk.menu.post()来实现

当应用程序失去焦点时,我不知道如何使此菜单消失。我需要这样做,因为即使切换到另一个窗口,菜单仍保持在顶部,留下菜单“工件”

我在菜单上放置了一个
事件,如果菜单具有焦点并且用户将焦点移动到另一个应用程序,则会触发该事件。这很有效

如果主应用程序窗口有焦点,我该怎么办?我可以在应用程序窗口上放置一个
事件,关闭菜单;但是,当我将焦点放在菜单上时,会调用它,从而关闭菜单。菜单是以父应用程序作为主应用程序创建的,因此我不确定当菜单获得焦点时,为什么主应用程序上的
会被触发

如何区分主应用程序窗口与菜单失去焦点的区别?

我不想使用tk_popup(),因为我希望用户继续向主窗口提供输入。(菜单的使用是可选的)

多亏了@Brad Lanam,我想出了一个解决方案,其中包括:

from Tkinter import *

class App(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)

        self.entry = Entry(self)
        self.entry.grid(padx=30, pady=30)
        self.entry.focus_set()
        self.entry.bind("<Tab>", self.put_menu)
        self.entry.bind("<Down>", self.set_focus_on_menu)

        self.menu = Menu(self, tearoff=False)
        self.menu.add_command(label="test")
        self.menu.bind("<FocusOut>", self.destroy_menu)


        self.bind("<FocusIn>", self.app_got_focus)
        self.bind("<FocusOut>", self.app_lost_focus)
        self.bind("<3>", self.put_menu)


    def app_got_focus(self, event):
        self.config(background="red")

    def app_lost_focus(self, event):
        self.config(background="grey")

        ######## SOLUTION BEGIN #########
        if self.focus_get() != self.menu:
            self.destroy_menu(event)
        ######## SOLUTION END ###########

    def set_focus_on_menu(self, event):
        self.menu.focus_set()

    def menu_got_focus(self, event):
        self.menu.activate(0)

    def put_menu(self, event):
        self.menu.post(self.winfo_x() + self.entry.winfo_x(), self.winfo_y() + self.entry.winfo_y()+20)

    def destroy_menu(self, event):
        self.menu.destroy()

app = App()

app.mainloop()
从Tkinter导入*
类应用程序(Tk):
定义初始化(self,*args,**kwargs):
Tk.\uuuuu初始值(self,*args,**kwargs)
self.entry=entry(self)
self.entry.grid(padx=30,pady=30)
self.entry.focus_set()
self.entry.bind(“,self.put\u菜单)
self.entry.bind(“,self.set\u focus\u在菜单上)
self.menu=menu(self,tearoff=False)
self.menu.add_命令(label=“test”)
self.menu.bind(“,self.destroy\u menu”)
self.bind(“,self.app\u获得焦点)
self.bind(“,self.app\u失去焦点)
self.bind(“,self.put\u菜单)
def应用程序获得焦点(自身、事件):
self.config(background=“red”)
def应用程序失去焦点(自身、事件):
self.config(background=“grey”)
########解决方案开始#########
如果self.focus_get()!=自助菜单:
自我销毁菜单(事件)
########溶液端###########
def在菜单上设置焦点(自我、事件):
self.menu.focus\u set()
def菜单获得焦点(自我、事件):
自我菜单激活(0)
def put_菜单(自身、事件):
self.menu.post(self.winfo_x()+self.entry.winfo_x(),self.winfo_y()+self.entry.winfo_y()+20)
def销毁菜单(自身、事件):
self.menu.destroy()
app=app()
app.mainloop()
self.focus\u get()将返回具有焦点的对象,该对象可用于区分接收焦点的菜单与其他应用程序

例如,要在焦点移动到其他应用程序时删除菜单,请执行以下操作:

def app_lost_focus(self, event):
    if self.focus_get() != self.menu:
        self.destroy_menu(event)

您在哪个平台上?回答您的一个问题,窗口有焦点,而不是应用程序。[已删除可能不起作用的解决方案]。如何处理:当主窗口失去焦点时,在X秒后,如果菜单没有焦点,请降低菜单窗口。请共享您找到的答案,并接受它,以便在未回答的问题列表中有更少的项。谢谢:)@jgoeders-为了让事情井然有序,请添加您的答案作为此问题的答案,并接受该答案(你完全可以接受自己对自己问题的回答——这也是关于拥有世界上最好的编程问答的问题,答案是否来自提出问题的同一个人并不重要。)