PyInstaller 和 QML 文件
PyInstaller and QML Files
如何将 QML 文件作为单个可执行文件包含到我的 Python 项目中。当我 运行 pyinstaller --onefile main.py
, 运行ning 可执行文件导致找不到 QML 文件的错误。除非我使用绝对路径或将 view.qml
放在与我的可执行文件相同的目录中。我不想有一个单独的 QML 文件,我希望它合并到可执行文件中。
main.py:
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(QUrl("view.qml"))
sys.exit(app.exec_())
view.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
#
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 为 data files
数据文件解压到sys._MEIPASS相对文件夹,如果不使用--onefile选项则该路径为可执行文件夹,否则解压到临时文件夹
在你的例子中,它实现了以下内容:
├── main.py
└── main.qml
main.py
import os
import sys
from PySide2 import QtCore, QtGui, QtQml
#
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_())
和运行pyinstaller如下:
pyinstaller --add-data "main.qml:." --onefile main.py
3。使用 Qt Resource
您可以创建一个添加 qml 的 .qrc,然后将它们转换为 .py,最后将其包含在 .py 中。
├── main.py
├── main.qml
└── qml.qrc
main.py
import sys
from PySide2 import QtCore, QtGui, QtQml
import qml_rc
if __name__ == "__main__":
import os
import sys
app = QtGui.QGuiApplication(sys.argv)
engine = QtQml.QQmlApplicationEngine()
engine.load(":/main.qml")
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
如何将 QML 文件作为单个可执行文件包含到我的 Python 项目中。当我 运行 pyinstaller --onefile main.py
, 运行ning 可执行文件导致找不到 QML 文件的错误。除非我使用绝对路径或将 view.qml
放在与我的可执行文件相同的目录中。我不想有一个单独的 QML 文件,我希望它合并到可执行文件中。
main.py:
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load(QUrl("view.qml"))
sys.exit(app.exec_())
view.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
#
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 为 data files
数据文件解压到sys._MEIPASS相对文件夹,如果不使用--onefile选项则该路径为可执行文件夹,否则解压到临时文件夹
在你的例子中,它实现了以下内容:
├── main.py
└── main.qml
main.py
import os
import sys
from PySide2 import QtCore, QtGui, QtQml
#
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_())
和运行pyinstaller如下:
pyinstaller --add-data "main.qml:." --onefile main.py
3。使用 Qt Resource
您可以创建一个添加 qml 的 .qrc,然后将它们转换为 .py,最后将其包含在 .py 中。
├── main.py
├── main.qml
└── qml.qrc
main.py
import sys
from PySide2 import QtCore, QtGui, QtQml
import qml_rc
if __name__ == "__main__":
import os
import sys
app = QtGui.QGuiApplication(sys.argv)
engine = QtQml.QQmlApplicationEngine()
engine.load(":/main.qml")
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