如何使用PyInstaller将QtVirtualKeyboard打包进二进制可执行文件
关于qt5-virtualkeyboard软件包的作用
你系统里的qt5-virtualkeyboard包是解决问题的前提:它提供了Qt虚拟键盘的所有运行时依赖(插件、QML组件、动态库等),你本地Python运行代码正常就是因为程序可以直接调用系统路径下的这些文件。打包时只需要把这些文件手动导入到PyInstaller的打包列表中即可。
需补充的PyInstaller参数
你需要在原编译命令中添加以下两个参数:
- 打包虚拟键盘输入上下文插件:
--add-binary "/usr/lib/qt/plugins/platforminputcontexts/libqtvirtualkeyboardplugin.so:platforminputcontexts" - 打包虚拟键盘对应的QML模块:
--add-data "/usr/lib/qt/qml/QtQuick/VirtualKeyboard:QtQuick/VirtualKeyboard"
修改后的完整编译命令如下:
pyinstaller --clean --onefile --add-data "./test.ui:." --add-binary "/usr/lib/qt/plugins/platforminputcontexts/libqtvirtualkeyboardplugin.so:platforminputcontexts" --add-data "/usr/lib/qt/qml/QtQuick/VirtualKeyboard:QtQuick/VirtualKeyboard" --noconsole vkeyboard_test.py
可选代码优化(避免路径识别异常)
建议你在代码开头设置环境变量的位置补充打包运行时的路径适配逻辑,防止程序运行时找不到打包后的插件路径:
import os import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5 import uic # 适配PyInstaller打包后的运行路径 if getattr(sys, 'frozen', False): # 打包后的运行状态 base_path = sys._MEIPASS os.environ['QT_PLUGIN_PATH'] = os.path.join(base_path, 'plugins') os.environ['QML2_IMPORT_PATH'] = base_path os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard" class Gui(QWidget): def __init__(self): super(Gui, self).__init__() uic.loadUi('test.ui', self) if __name__ == "__main__": app = QApplication(sys.argv) gui = Gui() gui.show() sys.exit(app.exec())
如果执行编译时提示文件路径不存在,可以用pacman -Ql qt5-virtualkeyboard命令查询你系统里对应文件的实际安装路径,替换命令里的路径即可。
内容的提问来源于stack exchange,提问作者Arsany Samuel
相关产品推荐
相关产品推荐

