Aar*_*ron 1 python pyinstaller qml pyside2
如何将 QML 文件作为单个可执行文件包含到我的 Python 项目中。当我运行时pyinstaller --onefile main.py,运行可执行文件会导致未找到 QML 文件的错误。除非我使用绝对路径或放置view.qml在与可执行文件相同的目录中。我不想有一个单独的 QML 文件,我希望它合并到可执行文件中。
主要.py:
if __name__ == "__main__":
  app = QGuiApplication(sys.argv)
  engine = QQmlApplicationEngine()
  engine.load(QUrl("view.qml"))
  sys.exit(app.exec_())
视图.qml:
import QtQuick 2.0
ApplicationWindow {
  id: window
  title: "Window"
  width: 900
  height: 600
  visible: true
}
我的回答除了展示如何在这种特殊情况下使用可能的重复答案外,还展示了使用 Qt 自己的工具的替代方案。
1.将.qml复制到同一个可执行文件夹
在这种情况下,您必须使用应用程序路径构建 qml 的绝对路径。
import os
import sys
from PySide2 import QtCore, QtGui, QtQml
# https://stackoverflow.com/a/404750/6622587
application_path = (
    os.path.dirname(sys.executable)
    if getattr(sys, "frozen", False)
    else os.path.dirname(os.path.abspath(__file__))
)
if __name__ == "__main__":
    import os
    import sys
    app = QtGui.QGuiApplication(sys.argv)
    engine = QtQml.QQmlApplicationEngine()
    file = os.path.join(application_path, "main.qml")
    engine.load(QtCore.QUrl.fromLocalFile(file))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())
然后将 .qml 复制到同一个可执行文件夹。
2.添加.qml作为数据文件
数据文件在相对于 sys._MEIPASS 的文件夹中解压,如果未使用 --onefile 选项,则该路径是可执行文件夹,否则将在临时文件夹中解压。
在您的情况下,它实现了以下内容:
??? main.py
??? main.qml
主文件
??? main.py
??? main.qml
并按如下方式运行 pyinstaller:
pyinstaller --add-data "main.qml:." --onefile main.py
3.使用Qt资源
您可以创建一个添加 qml 的 .qrc,然后将它们转换为 .py,最后将其包含在 .py 中。
??? main.py
??? main.qml
??? qml.qrc
主文件
import os
import sys
from PySide2 import QtCore, QtGui, QtQml
# https://stackoverflow.com/a/42615559/6622587
application_path = (
    sys._MEIPASS
    if getattr(sys, "frozen", False)
    else os.path.dirname(os.path.abspath(__file__))
)
if __name__ == "__main__":
    import os
    import sys
    app = QtGui.QGuiApplication(sys.argv)
    engine = QtQml.QQmlApplicationEngine()
    file = os.path.join(application_path, "main.qml")
    engine.load(QtCore.QUrl.fromLocalFile(file))
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())
qml.qrc
<RCC>
  <qresource prefix="/">
    <file>main.qml</file>
  </qresource>
</RCC>
要将 qml.qrc 转换为 .py,您必须使用以下命令:
pyside2-rcc qml.qrc -o qml_rc.py 
最后因为它已经是一个 .py 我们只运行 pyinstaller:
pyinstaller main.py --onefile
| 归档时间: | 
 | 
| 查看次数: | 1086 次 | 
| 最近记录: |