PyQt5+Nuitka打包后自定义Lemon字体缺失问题求助
解决Nuitka打包PyQt5后自定义字体失效问题
问题根源分析
- 打包命令路径错误:
--include-data-files参数的源文件路径写错,虽用户称分发文件夹存在字体,但命令中源路径误写为./fonts/lemon-regular-ttf(缺少.ttf后缀),可能导致打包逻辑异常 - 字体加载时机滞后:原代码在窗口创建完成后才加载字体,此时按钮已初始化,无法应用新注册的字体
- 相对路径不可靠:打包后exe运行时的当前工作目录未必是exe所在目录,相对路径可能无法定位字体文件
具体修复步骤
1. 修正打包命令
将--include-data-files的源路径改为正确的字体文件路径:
nuitka --follow-imports --enable-plugin=pyqt5 ` --include-data-files="./fonts/lemon-regular.ttf"="./fonts/lemon-regular.ttf" ` --disable-console --standalone ` main.py
2. 调整代码逻辑
- 将字体加载步骤移到窗口实例化之前
- 使用
sys._MEIPASS(Nuitka打包后自动设置的资源目录变量)或exe绝对路径定位字体,避免相对路径问题 - 增加字体加载验证,排查加载失败情况
修改后的代码:
import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtGui import QFont, QFontDatabase import os class App(QWidget): def __init__(self): super().__init__() self.btn = QPushButton('some text', self) self.btn.setFont(QFont('Lemon')) self.show() if __name__ == '__main__': app = QApplication(sys.argv) # 获取字体文件绝对路径 if hasattr(sys, '_MEIPASS'): # 打包后环境,从Nuitka资源目录读取 font_path = os.path.join(sys._MEIPASS, 'fonts', 'lemon-regular.ttf') else: # 开发环境,基于脚本目录定位 font_path = os.path.join(os.path.dirname(__file__), 'fonts', 'lemon-regular.ttf') # 加载字体并验证 font_id = QFontDatabase.addApplicationFont(font_path) if font_id == -1: print(f"字体加载失败: {font_path}") else: print(f"字体加载成功,字体族: {QFontDatabase.applicationFontFamilies(font_id)}") # 先加载字体再创建窗口 window = App() app.exec()
3. 验证测试
- 重新执行打包命令生成新exe
- 临时去掉
--disable-console参数,运行exe查看控制台输出,确认字体是否加载成功 - 检查按钮文本是否正常显示Lemon字体
内容的提问来源于stack exchange,提问作者DSP novice
相关产品推荐
相关产品推荐

