首页 > 解决方案 > 如何检测一个窗口是否在其他窗口前面

问题描述

当父母集中注意力时,有没有办法将子窗口放在前面?我要解决的是:我有一个父窗口(根)和一个名为“菜单”的子窗口(TopLevel)。子窗口是一个浮动菜单,上面有几个按钮,并且没有标题栏。

如果我设置 menu.wm_attributes('-topmost', 1) 比名为“menu”的子窗口始终保持在顶部,即使我打开另一个应用程序,菜单也会保持在所有窗口之上,这不是很实用。

如果我重置 menu.wm_attributes('-topmost', 0) 并且我专注于父窗口,则子窗口将停留在所有其他窗口之后,并且我看不到它。如果我正在运行我的应用程序,然后必须打开另一个应用程序,例如 Dbeaver 或 Firefox,就会出现这种情况。然后我将我的应用程序放在前面,但孩子留在 Dbeaver 或 Firefox 后面。

我想要做的是检测主窗口何时聚焦,以便我可以将子窗口放在前面,以便根和顶层都在前面。

我在网上做了一些广泛的搜索。发现很多关于检测窗口是打开还是关闭,但没有关于检测窗口是否打开。

我使用 python 3.8 和 tkinter。

这是我到目前为止在该部分代码中的内容。还不能完美地工作,但它非常接近:

def push_menu_front(event):
    focus = 0
    focus += 1
    if focus != 0:
        print("focus is 1")
        menu.wm_attributes('-topmost', 1)


def push_menu_back(event):
    focus = 0
    focus += 1
    if focus != 0:
        print("focus is 0")
        menu.wm_attributes('-topmost', 0)


root.bind("<FocusIn>", bring_menu_front)
root.bind("<FocusOut>", bring_menu_back)

标签: python-3.xtkinterfocus

解决方案


根据 Matiiss 的建议,我得到了以下代码,可以在 Windows 上运行,而不是在 Linux 上运行。因此,我将我的 Linux 版本和他的 Windows 版本结合起来,以根据所使用的操作系统工作。如已接受的答案所示,还有一个使用更少代码的新版本。

from tkinter import Tk, Toplevel
from sys import platform

def push_menu_front_win(event=None):
    menu.attributes('-topmost', True)
    menu.attributes('-topmost', False)

def push_menu_front(event=None):
    menu.attributes('-topmost', True)

def push_menu_back(event=None):
    menu.attributes('-topmost', False)

root = Tk()
root.title('master')
root.geometry("300x300+300+100")

menu = Toplevel(root)
menu.title('top')
menu.geometry("120x300+610+100")

# --------------- Select the OS used with if statement ----------
# Microsoft Windows OS
if platform == "win32":
    root.bind("<FocusIn>", push_menu_front_win)

# MAC OS
elif platform == "darwin":
    root.bind("<FocusIn>", push_menu_front)
    root.bind("<FocusOut>", push_menu_back)

# Linux OS
elif platform == "linux" or platform == "linux2":
    root.bind("<FocusIn>", push_menu_front)
    root.bind("<FocusOut>", push_menu_back)

root.mainloop()

这个没有边框的浮动窗口看起来很酷。它允许我使用完整的父窗口来显示数据库信息,并将按钮(功能)放在浮动菜单上。


推荐阅读