【发布时间】:2017-11-01 04:50:18
【问题描述】:
我有一个使用tkinter 创建GUI 的简单程序。 GUI 包含一个按钮,每次按下它都会创建一个新的 tkinter Toplevel 窗口。每个顶层窗口都包含一个从自定义 Figure 类创建的 matplotlib 图。
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from Tkinter import *
class MainGUI(Tk):
def __init__(self):
Tk.__init__(self)
Button(self, text="new_child", command=self.new_child).pack()
self.mainloop()
def new_child(self):
self.tl = TL()
class TL(Toplevel):
def __init__(self, **kw):
Toplevel.__init__(self, **kw)
self.data = "00000000000"*10000000 # just some data to analyze memory allocation
self._figure = MyFigure(self.data)
self._canvas = FigureCanvasTkAgg(self._figure, master=self)
self._canvas.get_tk_widget().grid(row=0, column=0, sticky="NSWE")
class MyFigure(Figure):
def __init__(self, data):
super(MyFigure, self).__init__()
self._data = data
if __name__ == '__main__':
MainGUI()
程序按预期运行,唯一的问题是关闭窗口不会释放任何内存。
当从顶层窗口中删除Figure 时,使用的内存会被正确释放,所以我认为Figure 会导致内存泄漏。
我读到引用计数不适用于使用 matplotlibs pyplot 接口创建的 Figure 对象,但这不适用于我的示例。 (详见here)
我不明白这里发生了什么,所以任何帮助将不胜感激。
提前致谢。
编辑
我忘了提到我已经尝试使用gc.collect() 手动调用垃圾收集器,但这并没有帮助。
【问题讨论】:
-
你是如何进行测试的?假设对象不再使用,我希望垃圾收集器最终会清理内存。
-
我已经尝试手动调用 gc,但这没有帮助。测试非常简单。打开/关闭子窗口,您会看到程序使用的内存随着每个创建的子窗口而增加。
-
能不能不覆盖
TL类的destroy方法,在销毁窗口之前删除图形?
标签: python python-2.7 memory matplotlib tkinter