Python matplotlib memoria obstruida (no se borra)

Tengo un problema con matplotlib que no borra la memoria (supongo). He intentado buscar en Google, pero en vano. Me gustaría que la memoria se borre cada vez que cierre la figura de matplotlib (que se invoca mediante el botón "PLOT"). Gracias por adelantado.

################
#IMPORT MODULES#
################

from Tkinter import *
import matplotlib.pyplot as plt

#####
#GUI#
#####

class Application(Frame):
    #read entry values and estimate the plot(s)
    def run_brussel(self):
        #read entry values
        t_start = float(self.t_start_entry.get())
        t_end = float(self.t_end_entry.get())
        t_diff = float(self.t_diff_entry.get())
        k1 = float(self.k1_entry.get())
        k2 = float(self.k2_entry.get())
        k3 = float(self.k3_entry.get())
        k4 = float(self.k4_entry.get())
        A = float(self.A_entry.get())
        B = float(self.B_entry.get())
        X = float(self.X_entry.get())
        Y = float(self.Y_entry.get())

        mode = self.mode.get()

        #estimate the values of the Brusselator X and Y functions
        brussel = brussel_func(t_start, t_end, t_diff, k1, k2, k3, k4, A, B, X, Y)

        t_list = brussel[0]
        X_list = brussel[1]
        Y_list = brussel[2]

        #plot the functions
        plot_brussel(mode, t_list, X_list, Y_list)

    #define labels, entries, radio buttons and buttons
    def createWidgets(self):
        self.t_start_label = Label(self, text="Start time:")
        self.t_start_label.grid(row=0, column=0, sticky=W)
        self.t_start_entry = Entry(self)
        self.t_start_entry.delete(0, END)
        self.t_start_entry.insert(0, "0.0")
        self.t_start_entry.grid(row=0, column=1)

        self.t_end_label = Label(self, text="End time:")
        self.t_end_label.grid(row=1, column=0, sticky=W)
        self.t_end_entry = Entry(self)
        self.t_end_entry.delete(0, END)
        self.t_end_entry.insert(0, "100.0")
        self.t_end_entry.grid(row=1, column=1)

        self.t_diff_label = Label(self, text="Time precision:")
        self.t_diff_label.grid(row=2, column=0, sticky=W)
        self.t_diff_entry = Entry(self)
        self.t_diff_entry.delete(0, END)
        self.t_diff_entry.insert(0, "0.0001")
        self.t_diff_entry.grid(row=2, column=1)

        self.k1_label = Label(self, text="Constant k1 value:")
        self.k1_label.grid(row=3, column=0, sticky=W)
        self.k1_entry = Entry(self)
        self.k1_entry.delete(0, END)
        self.k1_entry.insert(0, "1.0")
        self.k1_entry.grid(row=3, column=1)

        self.k2_label = Label(self, text="Constant k2 value:")
        self.k2_label.grid(row=4, column=0, sticky=W)
        self.k2_entry = Entry(self)
        self.k2_entry.delete(0, END)
        self.k2_entry.insert(0, "1.0")
        self.k2_entry.grid(row=4, column=1)

        self.k3_label = Label(self, text="Constant k3 value:")
        self.k3_label.grid(row=5, column=0, sticky=W)
        self.k3_entry = Entry(self)
        self.k3_entry.delete(0, END)
        self.k3_entry.insert(0, "1.0")
        self.k3_entry.grid(row=5, column=1)

        self.k4_label = Label(self, text="Constant k4 value:")
        self.k4_label.grid(row=6, column=0, sticky=W)
        self.k4_entry = Entry(self)
        self.k4_entry.delete(0, END)
        self.k4_entry.insert(0, "1.0")
        self.k4_entry.grid(row=6, column=1)

        self.A_label = Label(self, text="Initial A concentration:")
        self.A_label.grid(row=7, column=0, sticky=W)
        self.A_entry = Entry(self)
        self.A_entry.delete(0, END)
        self.A_entry.insert(0, "1.0")
        self.A_entry.grid(row=7, column=1)

        self.B_label = Label(self, text="Initial B concentration:")
        self.B_label.grid(row=8, column=0, sticky=W)
        self.B_entry = Entry(self)
        self.B_entry.delete(0, END)
        self.B_entry.insert(0, "2.5")
        self.B_entry.grid(row=8, column=1)

        self.X_label = Label(self, text="Initial X concentration:")
        self.X_label.grid(row=9, column=0, sticky=W)
        self.X_entry = Entry(self)
        self.X_entry.delete(0, END)
        self.X_entry.insert(0, "0.0")
        self.X_entry.grid(row=9, column=1)

        self.Y_label = Label(self, text="Initial Y concentration:")
        self.Y_label.grid(row=10, column=0, sticky=W)
        self.Y_entry = Entry(self)
        self.Y_entry.delete(0, END)
        self.Y_entry.insert(0, "0.0")
        self.Y_entry.grid(row=10, column=1)

        self.mode = IntVar()
        self.modus_operandi_label = Label(self, text="Plot type:")
        self.modus_operandi_label.grid(row=11, column=0, sticky=W)
        self.modus_operandi_button1 = Radiobutton(self, text="X : Y", variable=self.mode, value=True).grid(row=11, column=1, sticky=W)
        self.modus_operandi_button2 = Radiobutton(self, text="X, Y : time", variable=self.mode, value=False).grid(row=12, column=1, sticky=W)

        self.plot = Button(self)
        self.plot["text"] = "PLOT",
        self.plot["command"] = self.run_brussel
        self.plot.grid(row=13, column=0, columnspan=2, sticky=N+S+W+E)

        self.QUIT = Button(self)
        self.QUIT["text"] = "QUIT"
        self.QUIT["fg"]   = "red"
        self.QUIT["command"] =  self.quit_pressed
        self.QUIT.grid(row=14, column=0, columnspan=2, sticky=N+S+W+E)

    #invoke the window
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    #destroy the window
    def quit_pressed(self):
        quit()

######################
#FUNCTION DEFINITIONS#
######################

#Brusselator X and Y values estimation
def brussel_func(t_start, t_end, t_diff, k1, k2, k3, k4, A, B, X, Y):
    t = t_start
    t_list = []
    t_list.append(0)
    X_list = [X]
    Y_list = [Y]
    step = 0

    while t < t_end:
        X_diff = t_diff * (k1 * A - k2 * B * X_list[step] + k3 * X_list[step]**2 * Y_list[step] - k4 * X_list[step])
        Y_diff = t_diff * (k2 * B * X_list[step] - k3 * X_list[step]**2 * Y_list[step])
        X_list.append(X)
        Y_list.append(Y)
        t_list.append(t)
        t += t_diff
        X += X_diff
        Y += Y_diff
        step += 1

    return [t_list, X_list, Y_list]

#plot       
def plot_brussel(mode, t_list, X_list, Y_list):
    p = []

    #plots X : Y    
    if mode == True:
        p = plt.plot(X_list, Y_list)
        plt.xlabel('x')
        plt.ylabel('y')

    #plots X, Y : time
    else:
        p = plt.plot(t_list, X_list, label="X")
        p += plt.plot(t_list, Y_list, label="Y")
        plt.legend(loc="upper left", bbox_to_anchor=(1,1))
        plt.xlabel('time')

    #displays chosen plot
    plt.show(p)
    plt.clf(p)
    plt.close(p)

def main():
    root = Tk()
    root.wm_title("Brusselator")
    app = Application(master=root)
    app.mainloop()

#############
#SCRIPT BODY#
#############

if __name__ == '__main__':
    main()

Respuestas a la pregunta(0)

Su respuesta a la pregunta