【发布时间】:2021-11-28 16:39:15
【问题描述】:
当父级获得焦点时,有没有办法将子窗口放在前面?我要解决的是:我有一个父窗口(根)和一个名为“菜单”的子窗口(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)
【问题讨论】:
-
将窗口绑定到
<FocusIn>事件,例如root.bind('<FocusIn>', lambda e: print(e)),你也应该提供一个minimal reproducible example -
谢谢马蒂斯。我会试试这个建议。很难提供一个最小的可重现示例,因为我有数千行代码,我不确定哪个部分有用,但无论如何我都会尝试。l
-
你能看一下代码,看看是否有办法找到调整它并让它工作 100% 的时间。
-
你有没有尝试让子窗口成为主窗口的transient窗口?
-
transient窗口是一个子窗口,它始终位于其父窗口的顶部(z 顺序)。你不需要把注意力集中在外面的东西上。
标签: python-3.x tkinter focus