Python 3 中 tkFont 已被移除,需改用 tkinter.font;Tkinter 不支持直接加载本地字体文件,必须先通过系统安装字体,再用 font.families() 确认名称后使用。
tkFont 在 Python 3 中已不存在,改用 font 模块
Python 3.0 起 tkFont 模块被移除,所有字体操作统一由 tkinter.font 模块提供。如果你在代码里写了 import tkFont 或 from tkFont import Font,会直接报 ModuleNotFoundError: No module named 'tkFont'。必须改为:
from tkinter import font
注意:font 是 tkinter 的子模块,不是独立包,无需 pip 安装。
注册本地字体文件需依赖系统级加载(Tk 不直接支持)
Tkinter 本身不提供类似 font.register_font() 这样的 API 来加载 .ttf/.otf 文件。它只能使用操作系统已安装的字体。所谓“注册本地字体”,本质是让系统识别该字体文件,再通过字体名引用。
- Windows:双击 .ttf 文件 → “安装”(或复制到
C:\Windows\Fonts) - macOS:用“字体册”App 安装,或复制到
~/Library/Fonts/ - Linux(如 Ubuntu):放入
~/.local/share/fonts/,然后运行fc-cache -fv
完成后重启 Python 解释器(Tk 实例需重建),否则新字体不会出现在 font.families() 列表中。
如何确认字体是否可用并正确使用
别靠猜测字体名——不同系统对同一字体文件解析出的家族名可能不同(比如 “Source Han Sans CN” vs “思源黑体 CN”)。务必用 font.families() 实时查:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
from tkinter import font
print(font.families())
返回的是一个元组,包含所有可用字体名(含空格、中文、连字符)。使用时传入 font.Font 构造器即可:
f = font.Font(family="JetBrains Mono", size=12, weight="normal")
label = Label(root, text="code", font=f)
-
family必须完全匹配font.families()中的某一项(区分大小写,但通常不敏感) - 如果字体名含空格或特殊字符,不用加引号转义,字符串字面量即可
- 设置失败时 Tk 不报错,而是静默回退到默认字体(通常是 TkDefaultFont),需肉眼核对效果
动态加载字体的替代方案(仅限 Windows + ctypes)
极少数场景真需要不安装字体就加载(如便携应用),Windows 下可借助 ctypes 调用 GDI+ 的 AddFontResourceEx:
import ctypes
from ctypes import wintypes
FR_PRIVATE = 0x10
gdi32 = ctypes.WinDLL('gdi32')
add_font = gdi32.AddFontResourceExW
add_font.argtypes = [wintypes.LPCWSTR, wintypes.UINT, wintypes.LPVOID]
add_font.restype = wintypes.UINT
# 加载当前目录下的字体
add_font("FiraCode-Regular.ttf", FR_PRIVATE, 0)
⚠️ 注意:
- 该调用只对当前进程有效,退出即失效
- macOS/Linux 无等效 API,此法不具备跨平台性
- 仍需等待 Tk 重载字体列表,建议调用后延迟再执行
font.families() - 多数生产环境应避免这种 hack,优先走系统字体安装流程
真正卡住的往往不是代码怎么写,而是字体名没对上、系统缓存没刷新、或者误以为 Tk 能像 Pillow 那样直接读取字体文件路径。验证三步走:装字体 → 重启 Python → print(font.families()) 看得到再说。