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

我正在申请Tkinter。在应用程序中,我想弹出一个上下文菜单,这是使用Tk.Menu.post()完成的。

当应用程序失去焦点时,我不知道如何使此菜单消失。我需要执行此操作,因为即使在切换到另一个窗口时,菜单仍停留在最上面,而使菜单保留为“工件”。

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

如果主应用程序窗口具有焦点,该怎么办?我可以在应用程序窗口中放置一个<FocusOut>事件,以关闭菜单。但是,当我将注意力集中在菜单上时,该菜单最终被调用,从而关闭了菜单。该菜单是使用parent作为主要应用程序创建的,因此,我不确定为什么当菜单获得焦点时,主应用程序上的<FocusOut>甚至会被触发。

如何区分主应用程序窗口对其他应用程序失去焦点与菜单失去焦点?

我不想使用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()

参考方案

self.focus_get()将返回具有焦点的对象,该对象可用于区分接收焦点的菜单与其他应用程序。

例如,要在焦点移到另一个应用程序时删除菜单:

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

Tkinter:在背景图片上方覆盖标签 - python

我正在尝试使用Python和Tkinter创建我的第一个GUI。我想要一个背景图像,该图像随窗口大小以及在背景顶部的两个标签相应地调整大小,两个标签都放置在窗口的中间位置。两个标签是“全名”和“教育”,如下面的代码所示。当前,我正在使用pack()方法,并且一直在使用here中的窗口大小调整代码。我的问题是:如何使标签与背景图像重叠(代码中也包含标签)?用我…

如何在Python Tkinter中管理带边框标签内的间距? - python

我有一个程序,其中我制作了带边框的标签,但其带边框的位置太接近文本。我想在“边框”和“标签文本”之间给出间距。代码如下。from tkinter import * import tkinter as tk win = Tk() win.title("Labels") win.geometry("800x600+50+50…

是否可以在tkinter中使用透明/透明标签? - python

我在tkinter窗口中有一个图像背景,结果发现当您创建标签或框架时,默认值不会清除,而是灰色(它看起来很清晰,因为默认背景是相同的灰色)。最初我对框架有同样的问题,但是我将背景放在框架的前面,所以它们被隐藏了。但是,我无法使用标签来完成此操作,因为它们包含我要查看的文本。因此,是否可以使灰色不显示/将标签设置为“清除”(尝试使用bg =“ clear”和b…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…