2026年解码矩阵品牌口碑盘点:谁是行业最受认可的实力派?
2026/8/1 19:00:35
在基于 PySide6(Qt)+ Matplotlib 开发桌面 GUI 程序时,需要在界面中动态生成 Matplotlib 图像,并显示在 QLabel 中。
程序功能表现为:
// 提示信息 WinError 32: 另一个程序正在使用此文件,进程无法访问 C:\Users\xxx\AppData\Local\Temp\tmpxxxx.png
该错误并不会影响图像显示结果,但会中断后续逻辑,严重影响程序稳定性。
在排查过程中,最先怀疑的方向包括:
尝试过的方案包括:
最终定位发现,该问题是Windows 文件锁机制 + Qt 文件加载行为共同导致的结果。
// pythontemp_file=tempfile.NamedTemporaryFile(suffix=".png",delete=False)plt.savefig(temp_file.name)pixmap=QPixmap(temp_file.name)os.unlink(temp_file.name)(1)NamedTemporaryFile文件句柄未释放
在 Windows 系统中:
(2)QPixmap(file_path) 会锁定文件
QPixmap(path) 在 Windows 下会:
两者叠加后,100% 触发 WinError 32。
核心思想
Qt 显示图像应从内存加载,而不是直接从文件路径加载。
即:
// pythonimporttempfileimportosfromPySide6.QtGuiimportQPixmap #1.生成临时文件路径(不保持打开状态) fd,tmp_path=tempfile.mkstemp(suffix=".png")os.close(fd)#2.使用 fig.savefig 写入文件 fig.savefig(tmp_path,dpi=150,bbox_inches="tight")#3.读入内存withopen(tmp_path,"rb")asf:img_bytes=f.read()#4.从内存加载到 QPixmap pixmap=QPixmap()pixmap.loadFromData(img_bytes)#5.显示 label.setPixmap(pixmap)#6.安全删除文件 os.remove(tmp_path)| 项目 | 结果 |
|---|---|
| Windows 文件锁 | 完全规避 |
| Qt 文件句柄 | 不再占用磁盘 |
| 多次刷新 | 稳定 |
| 后端依赖 | 无 |
| GUI 响应 | 正常 |
这是PySide / PyQt 在 Windows 下加载临时图像的标准工程写法。
×不推荐写法
QPixmap(“xxx.png”)
NamedTemporaryFile(delete=False) 不关闭
plt.savefig() 混用 pyplot 状态
绘图后立即 os.unlink()
√推荐写法
fig.savefig()
mkstemp + os.close(fd)
QPixmap.loadFromData(bytes)
文件仅作为中转
本次问题并非 Matplotlib 绘图错误,而是:
Windows 文件锁机制 + Qt 图像加载方式 + 临时文件管理不当共同导致的典型 GUI 工程级问题。
通过将Qt 图像加载从“文件路径”切换为“内存数据”,问题得以彻底解决。
该经验适用于: