在两个tkinter窗口中,脚本在主循环后不执行

问题描述

我有一个脚本,其中包含两个tkinter.Tk()对象和两个窗口。一个按钮从一开始就被隐藏(使用.withdraw()),每个按钮都有一个隐藏自身并显示一个按钮(使用.deiconify())。我在开头显示的那个上使用了.mainloop()。一切正常,但是当我关闭任何一个窗口时,mainloop()之后的代码都不会运行,并且脚本也不会结束。

我想这是因为一个窗口仍然打开。如果是这种情况,如何关闭它?如果另一个关闭,是否可以在某个地方关闭窗口的支票?

如果没有,我该如何解决

我的代码的本质:

from tkinter import *

window1 = Tk()
window2 = Tk()
window2.withdraw()

def function1():
    window1.withdraw()
    window2.deiconify()

def function2():
    window2.withdraw()
    window1.deiconify()

button1 = Button(master=window1,text='1',command=function1)
button2 = Button(master=window2,text='2',command=function2)

button1.pack()
button2.pack()

window1.mainloop()

解决方法

根据评论汇总答案:

  1. 使用Toplevel而不是多个Tk()。推荐这样做,因为这样可以减少此类问题,并且在许多情况下是更好的选择。

  2. 使用协议处理程序,将一个窗口的关闭与两个窗口的关闭相关联。一种方法是以下代码:

from _tkinter import TclError

def close_both():
    for x in (window1,window2):
        try:
            x.destroy()
        except TclError:
            pass
for x in (window1,window2):
    x.protocol("WM_DELETE_WINDOW",close_both)