如何在 tkinter 的主窗口前面放置一个顶层窗口?

问题描述

有没有办法在主窗口前面放一个顶层窗口?

代码如下:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...