最近在使用tkinter的时候发现两个问题。
一:如何在关闭主窗口的同时关闭其他窗口?
二:如何防止重复打开同一窗口?
最后总结出两种方法,方法一只能解决问题一,方法二更为灵活,且能够同时解决两个问题!
方法一
import tkinter
def open_tk():
win_win = tkinter.Toplevel()
label = tkinter.Label(win_win, text='This is a test!')
label.pack()
win_win.mainloop()
if __name__ == '__main__':
win = tkinter.Tk()
win.title('test')
win.geometry('100x100')
button = tkinter.Button(win, text='hit me', font=('Arial', 12), width=10, height=1, command=open_tk)
button.pack()
win.mainloop()
方法二:(可以控制在关闭主窗口的同时关闭任意窗口,包括plt绘制的图片)
import tkinter
import matplotlib.pyplot as plt
class Test(object):
def __init__(self):
self.win = None
self.more_win = None
self.b1_flag = False
self.b2_flag = False
def start(self):
self.win = tkinter.Tk()
self.win.geometry('200x200')
button1 = tkinter.Button(self.win, text='hit me', font=('Arial', 12), width=10, height=1, command=self.click)
button1.pack()
button2 = tkinter.Button(self.win, text='plt', font=('Arial', 12), width=10, height=1, command=self.draw)
button2.pack()
self.win.protocol("WM_DELETE_WINDOW", self.quit_any)
self.win.mainloop()
def click(self):
if not self.b1_flag:
self.b1_flag = True
self.more_win = tkinter.Tk()
label = tkinter.Label(self.more_win, text='This is a test!')
label.pack()
self.more_win.protocol("WM_DELETE_WINDOW", self.quit_1)
self.more_win.mainloop()
def draw(self):
plt.close()
plt.figure()
plt.show()
def quit_1(self):
self.b1_flag = False
self.more_win.destroy()
def quit_any(self):
if self.b1_flag:
self.more_win.destroy()
plt.close()
self.win.destroy()
if __name__ == '__main__':
Test().start()