You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5+Nuitka打包后自定义Lemon字体缺失问题求助

解决Nuitka打包PyQt5后自定义字体失效问题

问题根源分析

  1. 打包命令路径错误:--include-data-files参数的源文件路径写错,虽用户称分发文件夹存在字体,但命令中源路径误写为./fonts/lemon-regular-ttf(缺少.ttf后缀),可能导致打包逻辑异常
  2. 字体加载时机滞后:原代码在窗口创建完成后才加载字体,此时按钮已初始化,无法应用新注册的字体
  3. 相对路径不可靠:打包后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:20:24