在 PyQt5 中实现 Lottie JSON 动画
Implementing a Lottie JSON animation into PyQt5
我正在开发 PyQt5 应用程序,我想将 Lottie JSON 动画引入其中。我进行了广泛的搜索,但只能找到类似 convert Lottie JSON to GIF/MP4 这样的结果。但这不是我真正想要的。
我从 Qt 网站上找到了 something。
我假设必须在上面的代码中进行一些更改,然后必须在 PyQt5 中实现为 样式 sheet。但我对样式表完全陌生
有人可以给出一个将 Lottie JSON 实现到 PyQt5 中的简短示例吗?
编辑 1:
根据@musicamante 发表的评论,据说 Qt 为 Lottie 使用了 QML。我找到了这个 example usage。有人可以给出简短的 Python 实现吗?
必须考虑以下因素:
- QtLottie 仅支持部分功能(至少在 Qt5 中,请参阅 this 了解更多信息)
- PyQt5 默认不提供 QtLottie。
最后,因为 QtLottie 只专注于 QML,所以没有必要为 Python 创建绑定,而是复制二进制文件。首先要知道编译 PyQt5 的 Qt 版本:
python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)"
对于 PyQt5 5.15.4,它是用 Qt 5.15.2 编译的。
要获取 Qt 二进制文件,您可以使用 aqtinstall 并下载 qtlottie(以下命令适用于 linux)。
python -m pip install aqtinstall
python -m aqt install --outputdir Qt 5.15.2 linux desktop -m qtlottie
要知道复制到哪个文件夹,必须执行以下命令:
python -c "from pathlib import Path; import PyQt5; print(Path(PyQt5.__file__).resolve().parent / 'Qt5')"
我们称之为 PyQt5_DIR。
所以你应该将文件“Qt/5.15.2/gcc_64/lib/libQt5Bodymovin.so.5.15.2”复制到“PyQt5_DIR/lib/libQt5Bodymovin.so.5”和文件夹“[=47” =].15.2/gcc_64/qml/Qt/labs/lottieqt" 到 "PyQt5_DIR/qml/Qt/labs".
现在的解决方案是使用 QQuickWidget 以便能够将 QML 与 QtWidgets 一起使用:
import os
import sys
from pathlib import Path
from PyQt5 import QtCore, QtWidgets, QtQuickWidgets
CURRENT_DIRECTORY = Path(__file__).resolve().parent
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
label_widget = QtWidgets.QLabel("Animation", alignment=QtCore.Qt.AlignCenter)
animation_widget = QtQuickWidgets.QQuickWidget(
resizeMode=QtQuickWidgets.QQuickWidget.SizeRootObjectToView
)
filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
url = QtCore.QUrl.fromLocalFile(filename)
animation_widget.setSource(url)
widget = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(widget)
lay.addWidget(label_widget, stretch=0)
lay.addWidget(animation_widget, stretch=1)
widget.resize(640, 480)
widget.show()
sys.exit(app.exec())
main.qml
import QtQuick 2.15
import Qt.labs.lottieqt 1.0
Item {
width: 100
height: 100
LottieAnimation {
anchors.fill: parent
loops: LottieAnimation.Infinite
source: "https://assets9.lottiefiles.com/temp/lf20_7rPCHc.json"
}
}
输出:
我正在开发 PyQt5 应用程序,我想将 Lottie JSON 动画引入其中。我进行了广泛的搜索,但只能找到类似 convert Lottie JSON to GIF/MP4 这样的结果。但这不是我真正想要的。 我从 Qt 网站上找到了 something。
我假设必须在上面的代码中进行一些更改,然后必须在 PyQt5 中实现为 样式 sheet。但我对样式表完全陌生
有人可以给出一个将 Lottie JSON 实现到 PyQt5 中的简短示例吗?
编辑 1: 根据@musicamante 发表的评论,据说 Qt 为 Lottie 使用了 QML。我找到了这个 example usage。有人可以给出简短的 Python 实现吗?
必须考虑以下因素:
- QtLottie 仅支持部分功能(至少在 Qt5 中,请参阅 this 了解更多信息)
- PyQt5 默认不提供 QtLottie。
最后,因为 QtLottie 只专注于 QML,所以没有必要为 Python 创建绑定,而是复制二进制文件。首先要知道编译 PyQt5 的 Qt 版本:
python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)"
对于 PyQt5 5.15.4,它是用 Qt 5.15.2 编译的。
要获取 Qt 二进制文件,您可以使用 aqtinstall 并下载 qtlottie(以下命令适用于 linux)。
python -m pip install aqtinstall
python -m aqt install --outputdir Qt 5.15.2 linux desktop -m qtlottie
要知道复制到哪个文件夹,必须执行以下命令:
python -c "from pathlib import Path; import PyQt5; print(Path(PyQt5.__file__).resolve().parent / 'Qt5')"
我们称之为 PyQt5_DIR。
所以你应该将文件“Qt/5.15.2/gcc_64/lib/libQt5Bodymovin.so.5.15.2”复制到“PyQt5_DIR/lib/libQt5Bodymovin.so.5”和文件夹“[=47” =].15.2/gcc_64/qml/Qt/labs/lottieqt" 到 "PyQt5_DIR/qml/Qt/labs".
现在的解决方案是使用 QQuickWidget 以便能够将 QML 与 QtWidgets 一起使用:
import os
import sys
from pathlib import Path
from PyQt5 import QtCore, QtWidgets, QtQuickWidgets
CURRENT_DIRECTORY = Path(__file__).resolve().parent
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
label_widget = QtWidgets.QLabel("Animation", alignment=QtCore.Qt.AlignCenter)
animation_widget = QtQuickWidgets.QQuickWidget(
resizeMode=QtQuickWidgets.QQuickWidget.SizeRootObjectToView
)
filename = os.fspath(CURRENT_DIRECTORY / "main.qml")
url = QtCore.QUrl.fromLocalFile(filename)
animation_widget.setSource(url)
widget = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(widget)
lay.addWidget(label_widget, stretch=0)
lay.addWidget(animation_widget, stretch=1)
widget.resize(640, 480)
widget.show()
sys.exit(app.exec())
main.qml
import QtQuick 2.15
import Qt.labs.lottieqt 1.0
Item {
width: 100
height: 100
LottieAnimation {
anchors.fill: parent
loops: LottieAnimation.Infinite
source: "https://assets9.lottiefiles.com/temp/lf20_7rPCHc.json"
}
}
输出: