Python tkinter Toplevel:试图理解一个关窗怪癖

Python tkinter Toplevel:试图理解一个关窗怪癖,python,tkinter,window,destroy,toplevel,Python,Tkinter,Window,Destroy,Toplevel,我创建了一个简单的Python/tkinter应用程序。它使用Tk()打开主窗口,使用Toplevel打开次窗口 我注意到了不寻常的行为:如果我在第一次单击主窗口之前尝试关闭辅助窗口,它会关闭两个窗口(这不是所需的行为)。但是,如果我首先单击主窗口,然后关闭辅助窗口,则主窗口将保持打开状态 所需的行为如下:我希望能够关闭辅助窗口,同时保持主窗口打开。我不想为了让主窗口保持打开状态而必须先单击主窗口。您应该能够直接转到辅助窗口并将其关闭,而不必关闭主窗口 为了防止主窗口不必要的关闭,我在代码中创建

我创建了一个简单的Python/tkinter应用程序。它使用Tk()打开主窗口,使用Toplevel打开次窗口

我注意到了不寻常的行为:如果我在第一次单击主窗口之前尝试关闭辅助窗口,它会关闭两个窗口(这不是所需的行为)。但是,如果我首先单击主窗口,然后关闭辅助窗口,则主窗口将保持打开状态

所需的行为如下:我希望能够关闭辅助窗口,同时保持主窗口打开。我不想为了让主窗口保持打开状态而必须先单击主窗口。您应该能够直接转到辅助窗口并将其关闭,而不必关闭主窗口

为了防止主窗口不必要的关闭,我在代码中创建了一个hack:我使用lift()来回交换堆叠顺序。这将产生所需的行为:我可以在不首先单击主窗口的情况下立即关闭辅助窗口,并且主窗口仍然保持打开状态。以下是我编写的代码:

import tkinter as tk

primary = tk.Tk()
primary.title("primary")
primary.geometry("200x200+500+300")

secondary = tk.Toplevel(primary)
secondary.title("secondary")
secondary.wm_geometry("300x300+100+100")

# hack lines: makes it so you can immediately
# close out of secondary without also closing
# out of primary. without these lines of code,
# primary will also close along with secondary
# unless you first click on primary.
primary.lift(secondary)
secondary.lift(primary)

primary.mainloop()
有没有一种方法可以在没有这种攻击的情况下达到同样的效果?我在试着理解为什么我需要在代码中加入这个黑客

当人们编写启动辅助窗口的代码时,通常是在从主窗口启动它的上下文中。这将强制用户首先单击主窗口。但由于我同时启动两个窗口,因此不能保证用户会首先单击主窗口。所以也许这就是为什么我需要安装电梯的原因

不必太挑剔,但我正在寻找一个简单的平面代码解决方案,而不是面向类的解决方案。因此,不涉及关键字class、self、super()、init、main、任何带有双下划线的内容等的解决方案有望实现。我在想我写的东西可能会有一个小的修正或小的补充。但我不知道那会是什么


我使用的是Windows,所以我不确定这是否适用于Mac或Linux。

在osx上没有这些行,它似乎工作得很好。谢谢,Reblochan。我要说的是我正在使用Windows。