python tkinter 在关闭主窗口时,同时关闭其他所有窗口或plt的图片,并且防止重复打开同一窗口

最近在使用tkinter的时候发现两个问题。
一:如何在关闭主窗口的同时关闭其他窗口?
二:如何防止重复打开同一窗口?
最后总结出两种方法,方法一只能解决问题一,方法二更为灵活,且能够同时解决两个问题!

方法一

import tkinter


def open_tk():
    win_win = tkinter.Toplevel() #利用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#打开窗口则标记为Ture
            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#关闭后,flag要回到False
        self.more_win.destroy()

    def quit_any(self):
        if self.b1_flag:#只有之前没有被销毁,才能在这里销毁
            self.more_win.destroy()
        plt.close()#有没有figure都可以close,无所谓
        self.win.destroy()


if __name__ == '__main__':
    Test().start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值