记录一次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 中应该有类似的变量内存监测工具,但是我没找到好的工具,如果有知道的,还请各位大佬在评论中指出

posted @ 2020-09-08 00:27  Hello_wshuo  阅读(238)  评论(0编辑  收藏  举报