背景
近期在學習PySide2相關知識,但是在運行官方的demo時卻遇到標題中的問題,折騰了很長時間,最後找到原因,現將整個問題發生及解決過程記錄如下。
環境
Win10 x64
Anaconda 3(內含Python3.7.1)
PySide2 5.14.1
VS Code 1.45.1
問題發生過程以及解決方案
(1) 從 https://doc.qt.io/qtforpython/tutorials/qmlintegration/qmlintegration.html下載main.py
和view.qml
後,導入到VS Code中,運行main.py,
(base) # python main.py --style=marterial
Traceback (most recent call last):
File "main.py", line 48, in <module>
from style_rc import *
ModuleNotFoundError: No module named 'style_rc'
解決方案: 這個原因很簡單,因爲沒有安裝style_rc
,由於不使用它,所以註釋掉這一行就行了。
(2) 再次運行main.py,又報了一個錯誤,
(base) # python main.py --style=marterial
QQmlApplicationEngine failed to load component
file:///E:/workspace_python/PySide/demo_qml/view.qml:43:1: module "QtQuick.Layouts" version 1.12 is not installed
意識是說沒有找到QtQuick.Layouts的1.12版本,我們看下view.qml
中都引入了哪些版本:
import QtQuick 2.0
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import QtQuick.Controls.Material 2.12
確認已安裝的Layouts版本號:
打開D:\Anaconda3\Library\qml\QtQuick\Layouts\plugins.qmltypes
,確認Layouts版本號1.3
:
// This file was auto-generated by:
// 'qmlplugindump -nonrelocatable QtQuick.Layouts 1.3'
解決方案: 修改Layouts版本號爲1.3。
(3) 繼續嘗試運行main.py,於是就報了標題的錯誤,也就是今天的重點問題:
(base) # python main.py --style=marterial
QQmlApplicationEngine failed to load component
file:///E:/workspace_python/PySide/demo_qml/view.qml:44:1: plugin cannot be loaded for module "QtQuick.Controls": ????????D:\Anaconda3\Library\qml\QtQuick\Controls.2\qtquickcontrols2plugin.dll?????????????????
期初也是在網上搜索是否有類似問題,確實有,但都沒有解決我的問題,而且我這裏多了一堆?????
,一頭霧水,直到在PySide2官網中看到下面一段話:https://wiki.qt.io/Qt_for_Python
這句話的意識是:PySide2的5.14版本在Windows上和Python 3.8.0不兼容,必須是3.8.1或更高版本。
檢查PySide2版本: 5.14.1,(我這裏能使用grep
命令,是因爲我安裝的cmder,如果是使用默認cmd的話,可以使用findstr
替代grep
),
(base) # conda list|grep pyside2
pyside2 5.14.1 pypi_0 pypi
檢查Python版本: 3.7.1,
(base) # python -V
Python 3.7.1
解決方案: 由於這個 Python是Anaconda自帶的,所以想着更新下Anaconda,但是發現還沒有包含Python3.8的Anaconda版本,於是直接從Python官網下載了最新的純Python版本:Python 3.8.3,
使用3.8.3來執行main.py,又報錯,如下:(注意這裏python.exe的全路徑包含了空格,所以要用引號括起來)
(base) # "D:\Program Files (x86)\Python3.8\python.exe" main.py --style=material
Traceback (most recent call last):
File "main.py", line 44, in <module>
from PySide2.QtCore import QObject, Slot
ModuleNotFoundError: No module named 'PySide2'
解決方案: 這一看就是沒有找到PySide2模塊,所以需要將其添加到Python的搜索路徑中:
在D:\Program Files (x86)\Python3.8\Lib\site-packages
文件夾新建任意名稱的.pth
文件,比如我新建的cust.pth
,然後將PySide2所在路徑加到該文件中,我的PySide2是通過Anaconda 中的pip下載的,路徑爲:D:\Anaconda3\Lib\site-packages
,保存退出。
再次執行:"D:\Program Files (x86)\Python3.8\python.exe" main.py --style=material
,成功!如下:
總結
主要原因是Python和PySide2版本不兼容導致的,需要更新Python版本。
還有一個遺留問題:D:\Anaconda3\Library\qml
和D:\Anaconda3\Lib\site-packages\PySide2\qml
下都有qml包,爲什麼Anaconda下的Python只使用前者?