PySide6整合Matplotlib与Librosa报错:int()参数类型错误
PySide6 + Librosa 波形图显示问题解决
问题场景
开发基于PySide6的GUI程序,使用Librosa展示WAV/MP3波形图,核心代码如下:
# 导入库 import librosa import librosa.display from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure # WavformShow.py中的代码 fig = Figure(figsize=(5, 2)) librosa.display.waveshow(data,sample_rate,offset=0.0)
报错信息
运行时触发如下错误:
Traceback (most recent call last): File "MainFrame_v8.py", line 8, in <module> from ClassicAudio.WavformShow import * File "E:\Code\Qt-proj\Pyside6UI\ClassicAudio\WavformShow.py", line 11, in <module> from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas File "C:\Users\rui\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 7, in <module> from .backend_qtagg import ( # noqa: F401, E402 # pylint: disable=W0611 File "C:\Users\rui\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_qtagg.py", line 12, in <module> from .backend_qt import ( File "C:\Users\rui\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_qt.py", line 73, in <module> _MODIFIER_KEYS = [ File "C:\Users\rui\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_qt.py", line 74, in <listcomp> (_to_int(getattr(_enum("QtCore.Qt.KeyboardModifier"), mod)), TypeError: int() argument must be a string, a bytes-like object or a number, not 'KeyboardModifier'
已尝试的操作
- 导入
matplotlib.pyplot as plt,问题未解决; - 使用
matplotlib.use('tkagg')切换后端,会弹出独立窗口,无法在GUI容器内显示波形图。
解决方案
1. 升级Matplotlib到兼容版本
该错误源于旧版Matplotlib对PySide6的枚举类型处理不兼容,Python3.8环境下建议升级Matplotlib到>=3.4.0版本:
pip install --upgrade matplotlib
2. 修正后端导入方式
如果暂时无法升级,可在导入Matplotlib模块前明确指定适配PySide6的后端:
import matplotlib matplotlib.use('QtAgg') # 指定适配PySide6的Qt后端 from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure
注意:改用backend_qtagg而非backend_qt5agg,因为QtAgg后端会自动适配PySide6/PyQt6。
3. 完善波形图绘制逻辑
原代码未将Librosa波形绑定到创建的Figure对象上,需补充子图创建和指定:
fig = Figure(figsize=(5, 2)) ax = fig.add_subplot(111) # 创建子图容器 librosa.display.waveshow(data, sr=sample_rate, offset=0.0, ax=ax) # 将波形绘制到指定子图 canvas = FigureCanvas(fig) # 生成可嵌入PySide6的画布 # 之后将canvas添加到PySide6的UI容器中,例如: # some_layout.addWidget(canvas)
内容的提问来源于stack exchange,提问作者Rui
相关产品推荐
相关产品推荐

