我从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
在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)
似乎FigureCanvasQtAgg不再被视为QWidget,因此无法将其添加到布局中。
我尝试添加以下行以建议here来建议pyside:
os.environ["QT_API"] = "PySide2"
matplotlib.use('Qt5Agg')
matplotlib.rcParams['backend.qt5']='PySide2'
但是,这不会更改exe的错误消息。在pycharm中,它仍然可以正常运行。
编辑:替换此行后,看来PySide2 + PyInstaller出现了问题:
from PySide2 import QtCore, QtWidgets
有这行:
from PyQt5 import QtCore, QtWidgets
即使在使用PyInstaller之后它仍然可以工作。
但是我想使用PySide2代替PyQt5,有人知道解决此问题的方法吗?
答案 0 :(得分:0)
对于PySide2,当我使用PySide 5.13版本时,我也遇到类似的问题。
对于PySide 5.6版,它正在 fine 上运行。
有趣的是,该问题看起来与matplotlib包装器类似。 FigureCanvasQTAgg
的包装程序似乎有所变化。一个有效的包装器是:Shiboken.ObjectType
。当一个不起作用时,包装器为:sip.wrappertype
。
答案 1 :(得分:0)
我有同样的问题。这对我有用
conda uninstall matplotlib
pip install matplotlib