问题描述
我有一个脚本,其中包含两个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()
解决方法
根据评论汇总答案:
-
使用
Toplevel
而不是多个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)