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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章