Python 对于两个tkinter窗口,脚本在一个';s主回路

Python 对于两个tkinter窗口,脚本在一个';s主回路,python,tkinter,Python,Tkinter,我有一个脚本,它有两个tkinter.Tk()对象和两个窗口。一个从一开始就隐藏(使用.draw()),每个按钮都有一个隐藏自己并显示另一个的按钮(使用.deiconify())。我在开头显示的一个上使用.mainloop()。一切正常,但当我关闭任一窗口时,mainloop()之后的代码不会运行,脚本也不会结束 我想这是因为有一扇窗户还开着。如果是这样,我如何关闭它?如果另一个窗口关闭,是否可以在关闭窗口的某个地方进行检查 如果没有,我如何修复此问题 我的代码的精髓: from tkinter

我有一个脚本,它有两个tkinter.Tk()对象和两个窗口。一个从一开始就隐藏(使用.draw()),每个按钮都有一个隐藏自己并显示另一个的按钮(使用.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()

根据评论汇编答案:

  • 使用
    Toplevel
    而不是多个
    Tk()
    s。这是推荐的做法,因为它减少了此类问题,并且在许多情况下是一个更好的选择

  • 使用协议处理程序,将一个窗口的关闭与两个窗口的关闭关联起来。执行此操作的一种方法是使用以下代码:


  • 几分钟前有人安静地回答。我会通读一遍,10-15分钟后给你回复。使用多个
    Tk
    实例很少是个好主意。你为什么不在第二个窗口中使用
    Toplevel
    ?我对tkinter很陌生,我不知道Toplevel是什么。我会读到的,也许这就是解决办法。顺便问一下,为什么使用多个Tk不是一个好主意?因为您正在创建一个新的
    Tk()
    实例,那么第一个窗口中的所有内容将仅保留在该窗口中,而不能与第二个窗口一起使用
    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)