繁体   English   中英

PyInstaller + PyQt5 + QML:未安装QtQuick

[英]PyInstaller + PyQt5 + QML: QtQuick is not installed

我正在尝试使用pyinstaller,PyQt5和qml(请参阅下面的文件)使用以下命令构建应用程序。

pyrcc5 pyqt5_qml.qrc > pyqt5_qml_qrc.py
pyinstaller -w -F --noupx pyqt5_qml.py

(OSX 10.11.1,python 3.5.0,qt 5.5.1,pyinstaller 3.0)

pyqt5_qml.py运行正常(打开一个“Hello world!”窗口)但是内置应用程序抱怨module "QtQuick" version 2.4 is not installed 我想该模块尚未包含在内置应用程序中,但我不知道如何告诉pyinstaller这样做。

pyqt5_qml.py:

import os, sys
from PyQt5 import QtCore, QtWidgets, QtQml
import pyqt5_qml_qrc

def main():
    global app 
    app = QtWidgets.QApplication(sys.argv)
    engine = QtQml.QQmlApplicationEngine()
    engine.load(QtCore.QUrl('qrc:/hello.qml'))
    root = engine.rootObjects()[0]
    root.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

hello.qml:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1

ApplicationWindow {
    title: qsTr("Window")
    Rectangle {
        width: 360
        height: 360
        Text {
            anchors.centerIn: parent
            text: "Hello World"
        }
        MouseArea {
            anchors.fill: parent
            onClicked: {
                Qt.quit();
            }
        }
    }
}

pyqt5_qml.qrc:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>hello.qml</file>
</qresource>
</RCC>

对我而言,在Windows上,这最终是尚未设置的QML2_IMPORT_PATH环境变量。 一旦我将其设置为“C:\\ Python35 \\ Lib \\ site-packages \\ PyQt5 \\ qml”就可以了!

使用PyInstaller我注意到它只是无法捆绑QML依赖关系然后冻结应用程序。 您可以通过从python站点包( <your_python_path>\\Lib\\site-packages\\PyQt5\\Qt\\qml )复制QtQuickQtQuick.2文件夹并将其QtQuick.2来检查是否是您的情况:

QtQuick
QtQuick.2
your_executable.exe

如果应用程序在此之后工作,您可以编辑.spec文件以自动捆绑这些文件夹(pyinstaller在首次运行时生成.spec -file)。

# -*- mode: python -*-
import os
import site

block_cipher = None

site_packages_dir = site.getsitepackages()[1]
qml_dir = os.path.join(site_packages_dir, 'PyQt5', 'Qt', 'qml')

added_files = [
    (os.path.join(qml_dir, 'QtQuick'), 'QtQuick'),
    (os.path.join(qml_dir, 'QtQuick.2'), 'QtQuick.2'),
]

a = Analysis(['pyqt5_qml.py'],
             binaries=None,
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='app',
          debug=False,
          strip=False,
          upx=False,
          console=True,
)

coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=False,
               name='pyqt5_qml')

然后尝试针对此spec文件运行pyinstallerpyinstaller pyqt5_qml.spec

我希望这可以有所帮助

我正在努力解决同样的问题

几个小时后,我做了一些简单的事情,但对我来说它很有用

在我的main.py中,我的意思是你加载我添加的QML文件的文件

import PyQt5.QtQuick

然后运行pyinstaller:

pyinstaller  -F  - -onefile main.py

它奏效了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM