嵌入PySide2的Matplotlib退出时出现内存释放错误求助
解决Matplotlib切换PySide2后端后关闭窗口出现
Fatal Python error: deallocating None的问题 我之前在把Matplotlib的PyQt5后端换成PySide2时,也碰到过完全一样的问题——正常关闭主窗口就弹出Fatal Python error: deallocating None的报错。看你修改的代码,和我当时的操作几乎一致:
原代码:
# Make sure that we are using QT5 matplotlib.use('Qt5Agg') from PyQt5 import QtCore, QtWidgets修改后:
# Make sure that we are using QT5 matplotlib.use('Qt5Agg') matplotlib.rcParams['backend.qt5']='PySide2' from PySide2 import QtCore, QtWidgets
这个错误的核心原因是Matplotlib和PySide2的资源释放顺序冲突,导致Python在清理对象时遇到了已被释放的空引用。这里有几个经过验证的解决办法,你可以挨个试试:
显式控制资源释放流程:在程序退出前,先手动关闭所有Matplotlib图形窗口,再终止Qt应用实例。在你的主程序末尾添加这段代码:
import matplotlib.pyplot as plt # 关闭所有Matplotlib窗口 plt.close('all') # 退出Qt应用 app = QtWidgets.QApplication.instance() if app is not None: app.quit()这样能确保Matplotlib的资源先被清理,再处理Qt的应用资源,避免交叉释放的问题。
调整初始化顺序:把PySide2的导入放到Matplotlib后端设置之前。修改后的代码应该是这样:
from PySide2 import QtCore, QtWidgets import matplotlib matplotlib.use('Qt5Agg') matplotlib.rcParams['backend.qt5'] = 'PySide2'让PySide2先完成自身的初始化,再让Matplotlib绑定对应的后端,能避免初始化阶段的资源绑定混乱。
直接导入适配PySide2的后端模块:放弃手动修改rcParams,直接导入Matplotlib为PySide2准备的后端组件。比如:
from PySide2 import QtCore, QtWidgets import matplotlib matplotlib.use('Qt5Agg') # 导入PySide2兼容的Matplotlib后端类 from matplotlib.backends.backend_qt5agg import ( FigureCanvasQTAgg as FigureCanvas, NavigationToolbar2QT as NavigationToolbar )这种方式会让Matplotlib自动适配PySide2的资源管理逻辑,减少手动配置带来的冲突。
内容的提问来源于stack exchange,提问作者Noresourses
相关产品推荐
相关产品推荐

