python-3.x - 如何检测一个窗口是否在其他窗口前面
问题描述
当父母集中注意力时,有没有办法将子窗口放在前面?我要解决的是:我有一个父窗口(根)和一个名为“菜单”的子窗口(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)
解决方案
根据 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()
这个没有边框的浮动窗口看起来很酷。它允许我使用完整的父窗口来显示数据库信息,并将按钮(功能)放在浮动菜单上。
推荐阅读
- swift - Swift:关于泛型函数和相关类型的问题
- android - 如何在 TextView 中显示来自 int 的十进制数字(Android Studio)
- mongodb - 使用 docker 配置 mongos 路由器
- reactjs - React useCallback 函数没有获取当前上下文值
- python - PermissionError: [errno 13] 在 Windows 10 中运行 python 脚本时权限被拒绝
- gmail - 过去 2 天格林威治标准时间 12:00 至 17:00 之间的 Google Cloud API 流量下降
- kubernetes - 使用 Java 客户端库从 Pod 访问 Kubernetes Api
- android - 滚动后颜色 CollapsingToolbarLayout
- python - 我应该如何将列中的数字转换为 Python 中相同的格式样式?
- checkout - Bigcommerce 结帐页面编辑