使用 PyInstaller 后,FigureCanvas 未解释为 QtWidget

bok*_*ing 5 python matplotlib pyside2

我对 matplotlib 中的示例进行了轻微修改:https://matplotlib.org/gallery/user_interfaces/embedding_in_qt_sgskip.html

唯一改变的是导入,因为我使用的是 PySide2,所以导入看起来像这样:

from PySide2 import QtCore, QtWidgets
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
Run Code Online (Sandbox Code Playgroud)

在 pycharm 中运行代码或单独运行脚本时,这工作正常,但是在使用 PyInstaller 创建 .exe 后,我收到以下错误:

TypeError: 'PySide2.QtWidgets.QBoxLayout.addWidget' called with wrong argument types:                                     
  PySide2.QtWidgets.QBoxLayout.addWidget(FigureCanvasQTAgg)                                                            
Supported signatures:                                                                                                     
  PySide2.QtWidgets.QBoxLayout.addWidget(PySide2.QtWidgets.QWidget, int=0, 
  PySide2.QtCore.Qt.Alignment=Default(Qt.Alignment))                                                                                                                     
  PySide2.QtWidgets.QBoxLayout.addWidget(PySide2.QtWidgets.QWidget)
Run Code Online (Sandbox Code Playgroud)

看来FigureCanvasQtAgg不再被识别为QWidget,因此无法将其添加到布局中。

我尝试添加这些行来建议 pyside,如下所示

os.environ["QT_API"] = "PySide2"
matplotlib.use('Qt5Agg')
matplotlib.rcParams['backend.qt5']='PySide2'
Run Code Online (Sandbox Code Playgroud)

但是,这不会更改 exe 的错误消息。在pycharm中仍然运行良好。

编辑:替换此行后,这似乎是 PySide2+PyInstaller 的一些问题:

from PySide2 import QtCore, QtWidgets
Run Code Online (Sandbox Code Playgroud)

用这一行:

from PyQt5 import QtCore, QtWidgets
Run Code Online (Sandbox Code Playgroud)

即使在使用 PyInstaller 之后它仍然可以工作。

但我想使用 PySide2 而不是 PyQt5,有人知道解决这个问题的方法吗?

kur*_*sun 2

对于PySide2,我在使用PySide 5.13版本时也遇到了类似的问题。

然而,它在 PySide 5.6 版本上运行良好。

有趣的是,这个问题看起来与 matplotlib 包装器有关。似乎 的包装器发生了变化FigureCanvasQTAgg。正在工作的包装器是:Shiboken.ObjectType。虽然不起作用,但包装器是:sip.wrappertype