使用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
相关产品推荐
相关产品推荐

