Declaración de FigureCanvasTkAgg provoca pérdida de memoria

Estoy teniendo dificultades para entender por qué la statement de FigureCanvasTkAgg causa una pérdida de memoria, tengo las siguientes líneas en mi método de clase __init__ :

  # pndwinBottom is a paned window of the main screen self.__drawplotFrame = Frame(pndwinBottom, width=WIDTH, height=HEIGHT) # the frame on which we will add our canvas for drawing etc. self.__fig = plt.figure(figsize=(16,11)) self.__drawplotCanvas = FigureCanvasTkAgg(self.__fig, master=self.__drawplotFrame) 

el problema es que al ejecutar mi aplicación y salir, python32.exe permanece en la ventana de mi proceso y obstruye mi computadora. Sin embargo, comentar estas tres líneas permitirá que mi aplicación salga y el proceso terminará correctamente. ¿Qué podrían hacer estas líneas a mi aplicación que evite que el proceso finalice después de que la aplicación haya finalizado? Gracias

editar


La pérdida de memoria parece ser causada solo por la línea self.__fig = plt.figure(figsize=(16, 11)) . ¿Necesito hacer algún tipo de deconstrucción con plt antes de salir?

Voy a suponer que esto se debe a que la figura de la pirota no se destruye cuando se cierra la ventana Tkinter.
Como en el ejemplo de incrustación en tk, intente usar la Figure :

 from matplotlib.figure import Figure self.__fig = Figure(figsize=(16,11)) 

ejemplo de uso:

 import Tkinter as tk import matplotlib matplotlib.use('TkAgg') from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class App(): def __init__(self, parent): self.__drawplotFrame = tk.Frame(parent, width=500, height=500) self.__drawplotFrame.pack() self.__fig = Figure(figsize=(16,11)) self.__p = self.__fig.add_subplot(1,1,1) self.__p.plot(range(10), range(10)) self.__drawplotCanvas = FigureCanvasTkAgg(self.__fig, master=self.__drawplotFrame) self.__drawplotCanvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) root = tk.Tk() App(root) root.mainloop() 

Estaba teniendo este problema con la pérdida de memoria, y creo que encontré una solución. En mi método __init__ estaba creando un marco y luego pasándolo a una función de trazado para hacer el trabajo real. En esa función, crearía una nueva instancia de matplotlib.figure.Figure, que por alguna razón no se destruyó cuando la función quedó fuera del scope.

Para resolverlo, hice esto: en el método __init__, creé no solo el marco, sino también la figura (completa con los ejes) y el canvas:

  results = tk.Frame(self) f = Figure() ax0 = f.add_subplot(211) ax1 = f.add_subplot(212) self.canvas = FigureCanvasTkAgg(f, results) self.canvas.get_tk_widget().pack(expand=True, fill='both') 

Luego, dentro del método de trazado,

  ax0, ax1 = self.canvas.figure.get_axes() ax0.clear() ax0.plot(x, y) ax1.clear() ax1.plot(x, z) self.canvas.draw() 

Y así, la fuga desapareció!