终端启动横幅、CI 日志、README 顶部标题、源码文件里的模块 banner,这些位置经常用 # / | \\ _ . 等可见 ASCII 字符拼出艺术字。pyfiglet 是经典工具 figlet 的 Python 移植版,开箱即用、零外部依赖(除 pyfiglet 本身),核心动作只有一行 renderText()。下面按安装、最简用法、工具类封装、多字体遍历和适用场景来整理实现过程。
一、安装与版本验证
安装后可以直接打印版本确认环境:
- import pyfiglet
- print(pyfiglet.__version__)
复制代码
二、最简用法:一行渲染
Figlet 是核心类,构造时传入 font,再调用 renderText(text) 就能得到艺术字字符串:
- from pyfiglet import Figlet
- art = Figlet(font="slant").renderText("Pytest")
- print(art)
复制代码
renderText 返回的是普通字符串,其中包含换行符。它既能直接 print,也能写文件,或者嵌入到其他输出流程里。
常用字体可以先记这几个,完整列表可通过 getFonts() 获取:standard 是经典标准风格;slant 是斜体、有科技感;block 偏方块风格;banner3-D 用于 3D 横幅;doom 粗犷厚重;starwars 是星球大战主题。
三、封装成 AsciiArtGenerator 工具类
把字体管理、异常回退、字体列举集中到一个类里,后续调用会更稳定:
- from pyfiglet import Figlet
- class AsciiArtGenerator:
- """ASCII 艺术字生成器"""
- RECOMMENDED_FONTS = [
- "standard",
- "slant",
- "block",
- "banner3-D",
- "doom",
- "epic",
- "larry3d",
- "isometric1",
- "starwars",
- "big",
- ]
- def __init__(self, font="slant"):
- self.font = font
- self.set_font(font)
- def set_font(self, font):
- """设置字体"""
- if font not in Figlet().getFonts():
- print(f"[!] 字体 '{font}' 未找到,回退到 standard")
- font = "standard"
- self.figlet = Figlet(font=font)
- def generate(self, text: str) -> str:
- """生成 ASCII 艺术字"""
- return self.figlet.renderText(text)
- def print_art(self, text: str):
- """直接打印 ASCII 艺术字"""
- art = self.generate(text)
- print(art)
- @staticmethod
- def list_fonts():
- """列出所有可用字体"""
- fonts = Figlet().getFonts()
- print(f"共 {len(fonts)} 种可用字体:\n")
- for i, f in enumerate(fonts, 1):
- print(f"{i:>4}. {f}")
- return fonts
复制代码
这个类的设计要点可以拆成几条:
1. Figlet 实例创建后复用。渲染文本时不再重复构造对象,减少无谓开销。
2. set_font() 抽取统一的字体设置入口,把字体校验、回退、Figlet 重建三件事放在同一处,构造函数和后续切换字体共用,避免逻辑重复或遗漏。
3. 字体校验必须前置。pyfiglet 在 Figlet(font=font) 构造时就会校验字体名,字体不存在会直接抛 FontNotFound,因此校验要在 Figlet(...) 之前用 if font not in Figlet().getFonts() 完成。
4. generate() 与 print_art() 分离。前者返回字符串,便于复用或写入文件;后者直接打印,便于调试。
5. list_fonts() 是静态方法,不依赖实例状态,返回 fonts 列表,也方便程序化使用,比如随机选字体或配合 set_font() 校验。
有一个细节值得注意:set_font() 只重建了 self.figlet,没有同步 self.font。当传入不存在的字体并回退到 standard 后,self.font 仍然是原来的值。如果业务代码依赖 self.font 记录当前字体,需要自行同步。另外,每次 set_font() 校验都会通过 Figlet().getFonts() 新建临时实例来取字体列表;如果程序中频繁切换字体,可以把字体列表缓存到类属性或模块级变量里复用,这是一个可选的优化方向。
四、遍历多种字体渲染多个单词
程序入口对 Python、Jenkins、Tools、Pytest 四个词逐个字体渲染:
- if __name__ == "__main__":
- generator = AsciiArtGenerator(font="slant")
- for key in ['Python', 'Jenkins', "Tools", "Pytest"]:
- key = ' '.join([i for i in key]) # 字母之间加空格,避免连笔不好看
- for font in generator.RECOMMENDED_FONTS:
- generator.set_font(font) # 切换字体
- generator.print_art(key)
复制代码
关键一行是 key = ' '.join([i for i in key]),它把 Python 拆成 P y t h o n。原因是部分字体字形比较密,字母连在一起时视觉上会糊成一片,显式加空格能明显提升清晰度和排版感。RECOMMENDED_FONTS 是类级列表,标出 10 种筛选过的好用字体,既作为遍历顺序,也作为默认推荐集。
把上面的代码保存为 demo.py 后运行:
输出会依次展示 Python、Jenkins、Tools、Pytest 在不同字体下的艺术字。
五、适合落地的几个场景
终端启动横幅:程序或 CLI 启动时打印一句艺术字,例如 APP READY。
CI/CD 日志:Jenkins、GitHub Actions 跑完后打印 SUCCESS 或 BUILD OK,日志可读性和仪式感并存。
README 头图:在 README 顶部放一行 ASCII 艺术字作为标题,仓库观感会明显提升。
代码注释或模块 banner:在文件顶部用 ASCII 字写模块名。
六、小结
一句话出图可以写成 Figlet(font="slant").renderText("Pytest");需要封装复用时用 AsciiArtGenerator(font=...).generate(text);异常回退放在构造函数内,通过 if font not in Figlet().getFonts() 回退到 standard;列出字体用 AsciiArtGenerator.list_fonts();多字体遍历则遍历 RECOMMENDED_FONTS。pyfiglet 让 ASCII 艺术字的生成成本降到一行代码,配合类封装后,可以在任何需要仪式感的位置直接嵌入。 |