Я пытаюсь создать приложение QT с диаграммой, которая периодически обновляется, и панелью навигации от backend_qt4agg. Они работают, но у меня есть такая проблема: всякий раз, когда я использую кнопку «зум» на панели инструментов, использование памяти (отслеживается в диспетчере задач Windows) увеличивается на 0,03 ГБ и не уменьшается, даже если я использую функция gc.collect () для очистки памяти.
Можно ли что-то сделать, чтобы предотвратить это?
Предполагается, что это приложение будет работать в течение нескольких дней, и если пользователь решит использовать панель инструментов для диаграммы, в какой-то момент ему не хватит памяти.
В качестве примечания я хотел бы, чтобы график оставался увеличенным при обновлении. Есть ли способ добиться этого?
from PySide2 import QtCore, QtWidgets
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT
from matplotlib.figure import Figure
import numpy
import random
import sys
from gc import collect
x = []
y = []
class Ui_main_window(QtWidgets.QMainWindow):
def __init__(self):
super(Ui_main_window, self).__init__()
self.setObjectName("main_window")
self.centralwidget = QtWidgets.QWidget(self)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.chart_canvas = MyCanvas(self.centralwidget, width=6, height=3, dpi=100)
self.gridLayout.addWidget(self.chart_canvas, 3, 0, 2, 6)
self.toolbar = NavigationToolbar2QT(self.chart_canvas, self.centralwidget)
self.toolbar.update()
self.gridLayout.addWidget(self.toolbar, 2, 0, 1, 4)
self.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(self)
self.menubar.setGeometry(QtCore.QRect(0, 0, 539, 21))
self.menubar.setObjectName("menubar")
self.retranslateUi(self)
QtCore.QMetaObject.connectSlotsByName(self)
self.show()
def retranslateUi(self, main_window):
_translate = QtCore.QCoreApplication.translate
main_window.setWindowTitle(_translate("main_window", "Main Window"))
class MyCanvas(FigureCanvas):
def __init__(self, parent=None, width=6, height=3, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.fig.add_subplot(111, frame_on=True)
FigureCanvas.__init__(self, self.fig)
self.setParent(parent)
self.lines = []
self.labels = []
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)
timer.start(3000)
def update_figure(self):
print("update_figure")
collect()
(processed_time_values, processed_numeric_values) = self.value_processing()
self.axes.cla()
self.axes.plot(numpy.array(processed_time_values), numpy.array(processed_numeric_values))
self.draw()
def value_processing(self):
global x, y
x.append(random.randint(0, 20))
y.append(random.randint(0, 20))
return x, y
app = QtWidgets.QApplication(sys.argv)
GUI_main_window = QtWidgets.QMainWindow()
main_window = Ui_main_window()
app.exec_()