简体   繁体   中英

PyQt4 / matplotlib - how to release memory?

I am using the matplotlib Qt4 backend to plot a large amount of data.

My question is: how do you properly close the matplotlib figure and release the memory occupied by the plot? figure.close() does not do the job, neither does closing the plot window.

The minimal working example below shows the problem:

import sys
from PyQt4 import QtGui

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
import matplotlib.pyplot as plt
from numpy.random import random

class MainWindow(QtGui.QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.setGeometry(50, 50, 200, 200)

        self.bPlot = QtGui.QPushButton('Plot',self)
        self.bPlot.resize(75,25)
        self.bPlot.move(25, 25)
        self.bPlot.clicked.connect(self.bPlotHandler)

        self.bClosePlot = QtGui.QPushButton('Close plot',self)
        self.bClosePlot.resize(75,25)
        self.bClosePlot.move(25, 75)
        self.bClosePlot.clicked.connect(self.bClosePlotHandler)

        self.show()

    def bPlotHandler(self):
        self.plotApp=PlotWindow()
        self.plotApp.plot()
        self.plotApp.show()

    def bClosePlotHandler(self):
        self.plotApp.figure.clf()
        self.plotApp=None

class PlotWindow(QtGui.QDialog):
    def __init__(self, parent=None):
        super(PlotWindow, self).__init__(parent)

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)

    def plot(self):
        data=random(1e5)
        ax = self.figure.add_subplot(111)
        ax.plot(data)
        self.canvas.draw()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    main = MainWindow()
    main.show()

    sys.exit(app.exec_())

Maybe you may delete the variable? Something like

del self.figure
self.figure = None

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM