问题描述
有没有办法在主窗口前面放一个顶层窗口?
代码如下:
from tkinter import *
root = Tk()
root.geometry('1280x720')
def create_new_window():
root2 = Toplevel()
root2.geometry('500x500')
create_new_window()
mainloop()
在这里,我希望 root2
窗口始终位于 root
窗口的前面。
我尝试使用 root2.attributes('-topmost',1)
,但问题是这一行也将窗口置于所有其他程序之上。
我想要的是顶层窗口应该只在主窗口的前面,并且当我点击主窗口时它不应该返回。
有没有办法在 tkinter 中实现这一点?
如果有人能帮助我就好了。
解决方法
我认为你想要的是一个短暂的窗口,你需要做:
root2.wm_transient(root)
来自手册:
wm 瞬态窗口?主? 如果指定了 master,则通知窗口管理器窗口是一个临时窗口(例如下拉菜单),代表 master 工作(其中 master 是顶级窗口的路径名)。如果 master 被指定为空字符串,则窗口不再被标记为临时窗口。否则,该命令返回窗口当前主窗口的路径名,如果窗口当前不是临时窗口,则返回一个空字符串。瞬态窗口将反映 master 中的状态更改,并在初始映射时继承 master 的状态。试图使窗口成为自身的瞬态是错误的。
,所以你可以做这样的事情,但对我来说似乎有问题。 我所做的是将 FocusOut 事件绑定到创建的顶层,因此每次它失去焦点时都会触发事件 stackingorder 将窗口放在右侧命令。您可能需要为您选择的几个事件使此代码过期,但为了让您了解.. 代码如下:
import tkinter as tk
def add_toplevel(idx,toplevel):
if idx == 'end':
idx = len(toplevels)
toplevels.insert(idx,toplevel)
def create_new_window():
root2 = tk.Toplevel()
root2.geometry('500x500')
add_toplevel('end',root2)
root2.bind('<FocusOut>',stackingorder)
def stackingorder(event):
for toplevel in toplevels:
toplevel.lift()
toplevel.update_idletasks()
toplevels = [] #stacking order by index
root = tk.Tk()
create_new_window()
root.mainloop()
您可能也对这个感兴趣: https://stackoverflow.com/a/10391659/13629335