[Python] 借助 turtle 逐字展示唐诗《金缕衣》

背景

Python 借助 Turtle 逐字展示《醉翁亭记》和《兰亭集序》 一文中,我们探索了如何借助 turtle --- Turtle graphics 展示《醉翁亭记》《兰亭集序》之类的经典古文。由此,我联想到,还可以用它来逐字展示唐诗。

正文:逐字展示《金缕衣》

代码

完整的代码如下 ⬇️

python 复制代码
import math
import time
from turtle import Screen, Turtle

ARTICLE = (
    "勸君莫惜金縷衣"
    "勸君惜取少年時"
    "花開堪折直須折"
    "莫待無花空折枝"
)

CHAR_SIZE = 28
CHAR_WIDTH = 40
CHARS_PER_COLUMN = 7
COLUMN_SPACING = 48
MARGIN = 80

CHAR_DELAY_MS = 150


def load_article():
    return ARTICLE


def draw_char(x, y, ch, pen):
    pen.penup()
    pen.goto(x, y)
    pen.pendown()
    font = ("LXGWWenKai-Regular", CHAR_SIZE, "normal")
    pen.write(ch, align="center", font=font)


def setup_screen(width, height):
    screen = Screen()
    screen.setup(width, height)
    screen.title("金縷衣")
    screen.tracer(0)
    return screen


def setup_pen():
    pen = Turtle()
    pen.hideturtle()
    pen.color("black")
    return pen


def draw_next_char(position, characters, screen, pen, start_x, start_y):
    col = position // CHARS_PER_COLUMN
    row = position % CHARS_PER_COLUMN

    x = start_x - col * COLUMN_SPACING
    y = start_y - row * CHAR_WIDTH

    ch = characters[position]
    draw_char(x, y, ch, pen)
    screen.update()


def main():
    characters = list(load_article())

    total = len(characters)
    column_count = math.ceil(total / CHARS_PER_COLUMN)
    content_width = (column_count - 1) * COLUMN_SPACING
    content_height = (CHARS_PER_COLUMN - 1) * CHAR_WIDTH + CHAR_SIZE

    screen_width = content_width + 2 * MARGIN
    screen_height = content_height + 2 * MARGIN

    start_x = screen_width // 2 - MARGIN
    start_y = screen_height // 2 - MARGIN - CHAR_SIZE

    screen = setup_screen(screen_width, screen_height)
    pen = setup_pen()

    for position in range(total):
        draw_next_char(position, characters, screen, pen, start_x, start_y)
        time.sleep(CHAR_DELAY_MS / 1000)

    screen.mainloop()


if __name__ == "__main__":
    main()

请将上述代码保存为 jin.py,用如下的命令可以运行 jin.py

bash 复制代码
python3 jin.py

运行的效果如下图所示 ⬇️

注意事项

如果您在运行时遇到了报错,可以从以下方面进行排查

其他

将代码稍作修改,就可以展示其他唐诗。需要修改的地方如下 ⬇️

例如以下代码可以逐字展示唐诗《江雪》

python 复制代码
import math
import time
from turtle import Screen, Turtle

ARTICLE = (
    "千山鳥飛絕"
    "萬徑人蹤滅"
    "孤舟簑笠翁"
    "獨釣寒江雪"
)

CHAR_SIZE = 28
CHAR_WIDTH = 40
CHARS_PER_COLUMN = 5
COLUMN_SPACING = 48
MARGIN = 80

CHAR_DELAY_MS = 150


def load_article():
    return ARTICLE


def draw_char(x, y, ch, pen):
    pen.penup()
    pen.goto(x, y)
    pen.pendown()
    font = ("LXGWWenKai-Regular", CHAR_SIZE, "normal")
    pen.write(ch, align="center", font=font)


def setup_screen(width, height):
    screen = Screen()
    screen.setup(width, height)
    screen.title("江雪")
    screen.tracer(0)
    return screen


def setup_pen():
    pen = Turtle()
    pen.hideturtle()
    pen.color("black")
    return pen


def draw_next_char(position, characters, screen, pen, start_x, start_y):
    col = position // CHARS_PER_COLUMN
    row = position % CHARS_PER_COLUMN

    x = start_x - col * COLUMN_SPACING
    y = start_y - row * CHAR_WIDTH

    ch = characters[position]
    draw_char(x, y, ch, pen)
    screen.update()


def main():
    characters = list(load_article())

    total = len(characters)
    column_count = math.ceil(total / CHARS_PER_COLUMN)
    content_width = (column_count - 1) * COLUMN_SPACING
    content_height = (CHARS_PER_COLUMN - 1) * CHAR_WIDTH + CHAR_SIZE

    screen_width = content_width + 2 * MARGIN
    screen_height = content_height + 2 * MARGIN

    start_x = screen_width // 2 - MARGIN
    start_y = screen_height // 2 - MARGIN - CHAR_SIZE

    screen = setup_screen(screen_width, screen_height)
    pen = setup_pen()

    for position in range(total):
        draw_next_char(position, characters, screen, pen, start_x, start_y)
        time.sleep(CHAR_DELAY_MS / 1000)

    screen.mainloop()


if __name__ == "__main__":
    main()

运行的效果如下图所示

维机文库 中提供了 唐詩三百首 的链接,从中也许可以找到您感兴趣的唐诗

参考资料

相关推荐
Python大数据分析@3 小时前
使用大模型MCP采集数据,爬虫已经无门槛
python·网络爬虫
quantdash_cc3 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
65岁退休Coder3 小时前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境3 小时前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python
半亩码田4 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
Wzx1980124 小时前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker
Python私教4 小时前
签名 URL 刷新导致审批失效?别急着删掉所有 query
python·安全
牧羊人.3334 小时前
Python 办公自动化从入门到入土|09 数据容器之字典
开发语言·python
Zane19945 小时前
类变量与实例变量:一个共享列表引发的线上事故
后端·python