记录一次PyQt5内存泄漏的问题解决
前言
前几天利用python-mpv写了一个播放器,但是跑着跑着发现内存越来越大,经过我反复调试终于解决了这个问题。
解决思路
模块定位
首先我是一个模块一个模块测试的,这样可以尽快缩减出问题的代码范围,因为我一共就写了两个模块:播放列表模块,播放器模块。所以我测试到出问题的模块还是很快的,定位到了是播放器模块出来问题,我发现只要播放器模块启动,那么内存泄漏,那么就可以确定是播放器模块内部代码有资源重复加载,没有释放。
进一步定位
我通过测试,音乐播放的时候,和停止播放的时候,这两种状态下,内存的变化情况,发现,无论是否在播放的条件下,内存都会泄漏,那么这一下子就可以缩小代码范围了,也就是当构造函数执行的时候,QTimer发射信号的槽函数内部出了问题,总与我定位到了具体出问题的代码:
def setIcon(widget,type_,size):
widget.setText(iconTextData[type_])
fontId = QFontDatabase.addApplicationFont("icon/iconfont.ttf")
font = QFontDatabase.applicationFontFamilies(fontId)[0]
font.setPixelSize(size)
font = QFont(msyh)
widget.setFont(font)
关键就在于QFontDatabase.addApplicationFont("icon/iconfont.ttf")
这行代码,相当于每一次修改图标,都会添加一遍iconfont.ttf
所以才会造成内存泄漏
那么将其独立出来,让其在构造函数中只执行一次,修改为:
def loadFont():
fontId = QFontDatabase.addApplicationFont("icon/iconfont.ttf")
msyh = QFontDatabase.applicationFontFamilies(fontId)[0]
font = QFont(msyh)
return font
def setIcon(widget,type_,size,font):
widget.setText(iconTextData[type_])
font.setPixelSize(size)
widget.setFont(font)
其他
python 中应该有类似的变量内存监测工具,但是我没找到好的工具,如果有知道的,还请各位大佬在评论中指出
本文来自博客园,作者:Hello_wshuo,转载请注明原文链接:https://www.cnblogs.com/Hellowshuo/p/15622159.html