使用auto-py-to-exe打包带tkextrafont自定义字体的Tkinter程序报错解决
解决auto-py-to-exe打包Tkinter程序时tkextrafont找不到的问题
问题描述
用auto-py-to-exe打包含tkextrafont的Tkinter程序,PyCharm中运行字体显示正常,但打包后的exe运行时报错:
FileNotFoundError: [WinError 2]: 'C:\Users\test\AppData\Local\Temp\_MEI21562\tkextrafont'
原代码(存在缺失导入的问题):
from tkinter import Tk, Label from tkextrafont import Font def resource_path(relative_path): base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) root = Tk() font_reg = Font(file=resource_path('./font/Manrope-Regular.ttf'), family='Manrope') label = Label(text="test",font=('Manrope', 30, 'bold')) label.pack() root.mainloop()
解决方案
1. 修正代码缺失的导入
原代码中resource_path函数使用了sys和os模块但未导入,先补上:
import sys import os from tkinter import Tk, Label from tkextrafont import Font def resource_path(relative_path): base_path = getattr(sys, "_MEIPASS", os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) root = Tk() font_reg = Font(file=resource_path('./font/Manrope-Regular.ttf'), family='Manrope') label = Label(text="test", font=('Manrope', 30, 'bold')) label.pack() root.mainloop()
2. 通过auto-py-to-exe GUI配置打包参数
打开auto-py-to-exe后,完成基础配置(选择脚本、打包模式等),再添加以下设置:
- Hidden Imports:在对应输入框中填入
tkextrafont,让PyInstaller强制打包该模块 - Additional Files:点击「Add Files」选择你的
Manrope-Regular.ttf文件,设置「Destination」为./font/,确保字体文件会被放到exe解压后的对应目录
3. 手动生成spec文件打包(更可控)
如果GUI配置仍有问题,可手动生成spec文件打包:
- 运行命令生成基础spec文件:
pyi-makespec --onefile --hidden-import=tkextrafont your_script.py - 打开生成的
your_script.spec文件,修改datas参数,添加字体文件的打包规则:a = Analysis( ['your_script.py'], ... datas=[('./font/Manrope-Regular.ttf', './font')], ... ) - 执行打包命令:
pyinstaller your_script.spec
问题根源
- 代码缺失
sys和os模块导入,导致路径处理函数失效 - PyInstaller默认无法自动识别
tkextrafont的依赖,需手动指定隐藏导入 - 字体文件未被添加到打包资源中,exe运行时找不到字体文件
内容的提问来源于stack exchange,提问作者Paichiwo
相关产品推荐
相关产品推荐

