Python matplotlib-Speicher verstopft (wird nicht gelöscht)
Ich habe ein Problem damit, dass matplotlib den Speicher nicht löscht (nehme ich an). Ich habe versucht, mich bei Google umzuschauen, aber ohne Erfolg. Ich möchte, dass der Speicher jedes Mal gelöscht wird, wenn ich matplotlib figure schließe (was über die Schaltfläche "PLOT" aufgerufen wird). Danke im Voraus.
################
#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()