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

使用PyInstaller打包Tkinter GUI时如何确保字体在所有系统生效?

解决Tkinter程序打包OneFile后自定义字体失效问题

步骤1:整理文件结构

将freesans.ttf字体文件和Python主脚本放在同一目录,结构示例:

your_project/
├── main.py
└── freesans.ttf

步骤2:修改代码动态获取字体路径

OneFile模式打包后,程序会临时解压到系统临时目录,不能写死字体路径,需动态获取:

import tkinter as tk
from tkinter import font
import sys
import os

def get_resource_path(relative_path):
    try:
        # 打包后PyInstaller生成的临时资源目录
        base_path = sys._MEIPASS
    except Exception:
        # 未打包时的当前工作目录
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

# 加载自定义字体
font_path = get_resource_path("freesans.ttf")
# 方式1:直接通过file参数加载
custom_font = font.Font(file=font_path, size=12, weight="normal")
# 方式2:指定字体族(若方式1识别异常可尝试)
# custom_font = font.Font(family="FreeSans", size=12)
# custom_font.config(family=font.Font(file=font_path).family)

# 测试字体使用
root = tk.Tk()
test_label = tk.Label(root, text="自定义字体测试", font=custom_font)
test_label.pack(padx=20, pady=20)
root.mainloop()

步骤3:修改PyInstaller打包命令

通过--add-data参数告诉PyInstaller打包字体文件:

  • Windows系统:
pyinstaller --onefile --add-data "freesans.ttf;." main.py
  • macOS/Linux系统:
pyinstaller --onefile --add-data "freesans.ttf:." main.py

(注意Windows用分号分隔路径,类Unix系统用冒号)

关键说明

  • sys._MEIPASS是PyInstaller为OneFile模式创建的临时目录,程序运行时会将打包的资源解压至此,通过这个路径能确保跨环境找到字体文件。
  • 若加载字体后Tkinter仍无法识别,可尝试先通过font.Font(file=font_path)获取字体族名,再将族名赋值给后续的字体对象。

内容的提问来源于stack exchange,提问作者JAY100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:20:33