Python Turtle 绘制姓名笔画:爬取汉字坐标,用画笔“写”出你的名字

用代码“写字”听起来很酷吧?本文带你用 Python 的 turtle 绘图库,结合网络爬虫获取汉字笔画坐标,实现一个自动绘制任意姓名的趣味工具。从原理到代码,一步步拆解。

前言

用 Python 的乌龟画图(turtle)模块,像书法家一样一笔一划写出汉字?这并不是靠预设的矢量图,而是动态获取汉字的笔画轨迹坐标,然后让画笔沿着这些坐标移动。

本文的灵感来源于一个有趣的工具:通过在线汉字笔画查询 API,获取每个字的笔画顺序和坐标点,再使用 turtle 精确绘制出来。整个项目涉及:

  • 网络请求:用 requests 获取笔画数据。
  • 正则解析:提取坐标点。
  • Turtle 绘图:模拟书写过程。

代码虽然不长,但涵盖了 Python 爬虫、数据解析、图形绘制等知识点,非常适合练手。

一、效果展示

运行程序后,会弹出一个 Turtle 窗口,依次绘制出你指定的汉字。例如,输入 好酷王董基,效果类似于:

在这里插入图片描述

每个字都会按照其标准笔画顺序“写”出来,笔画颜色和粗细均可自定义。

二、实现原理

2.1 核心思路

  1. 获取笔画坐标数据:向一个免费的汉字笔画查询 API 发送请求,传入目标汉字,返回该字的笔画轨迹(一系列坐标点)。
  2. 解析坐标:从返回的 JavaScript 代码中提取出每个笔画的坐标点数组。
  3. Turtle 绘制:将坐标点映射到 turtle 画布上,抬起画笔移动到起点,然后落笔按顺序连接各点,完成一个笔画。

2.2 关键技术

技术 作用
requests 发送 HTTP 请求,获取 API 返回的字符串。
re (正则表达式) 从响应文本中提取坐标数据。
urllib.parse.quote 对汉字进行 URL 编码,确保参数正确传递。
turtle 根据坐标点绘制笔画轨迹。

三、环境准备

3.1 安装依赖

本项目需要 requests 库(turtle 是 Python 内置模块,无需安装)。在终端执行:

pip install requests

**

## 四、完整代码详解

**
下面是完整的代码,我添加了详细的注释。你可以直接复制保存为 .py 文件运行。

```python
在这里插入代码片# -*- coding: utf-8 -*-          #数据编码,防止出现乱码,

import turtle      #导入相应的turtle的模块,以及requests的模块
import requests, re
from urllib.parse import quote


def get_word_coordinate(target_word):         #利用函数名来获取目标字。
    """ 获取指定汉字的笔画坐标 """
    url = "https://bihua.bmcx.com/web_system/bmcx_com_www/system/file/bihua/get_0/"

    params = {                           #导入笔画的坐标数,
        'font': quote(target_word).replace("%", "").lower(),        #笔画的绘画名字坐标所占的位置。
        'shi_fou_zi_dong': '1',
        'cache_sjs1': '20031914',
    }
    print(params)             #导入params的函数。
    response = requests.get(url, params=params)
    content = response.text
    content = content.replace('hzbh.main(', '').split(');document.getElementById')[0]
    content = content.split('{')[-1].split("}")[0]      #当前的字符段,以及分隔符。
    pattern = re.compile(r'\w:\[(.+?)\]')   #当前的模式。
    result = re.split(pattern, content)
    order_xy_routine = []         #进行数组排序。
    words_cnt = 0
    for r in result:                     #再进行for循环输出结果。
        sec = re.findall(r'\'.+?\'', r)
        if len(sec):
            orders = sec[1].split('#')
            for order in orders:
                order_str = re.findall(r'\(\d+,\d+\)', order)
                order_xy = [eval(xy) for xy in order_str]
                order_xy_routine.append(order_xy)
            words_cnt += 1
    print(order_xy_routine)
    return order_xy_routine


def draw_words(target_words, startx, starty, pencolor, pensize):           #绘画窗口,目标笔画,以及字迹。
    """绘制汉字"""
    turtle.title("我的Turtle绘画窗口")  # 设置窗口名称。
    turtle.pensize(pensize)
    turtle.pencolor(pencolor)
    turtle.pu()  # 抬起进行画笔
    coordinates = get_word_coordinate(target_words)
    for index, coordinate in enumerate(coordinates):
        turtle.goto((startx + coordinate[0][0]) / 4, -(starty + coordinate[0][1]) / 4)
        turtle.pd()
        for xy in coordinate:
            x, y = xy
            turtle.goto((startx + x) / 4, -(starty + y) / 4)
        turtle.pu()


if __name__ == '__main__':         #利用main方法执行程序,输出结果的数值。

    words = '好酷王董基'  # 导入你所需要的要绘制的姓名
    pencolor = "#6666FF"  # 设置画笔颜色;
    pensize = 9  # 设置笔画粗细if __name__ == '__main__':
    start_x = -2000 # 离左侧距离

    char_list = list(words)
    for w in char_list:
        draw_words(w, start_x, -300, pencolor, pensize)        #导入字符串,以及列表绘画坐标
        start_x += 800
    turtle.done()    #绘画终止过程。




五、代码关键点解读

5.1 坐标获取与解析
API 返回的是一段 JavaScript 代码,类似:

javascript
hzbh.main('好',{1:[(0,0),(10,5),...],2:[...]});

我们需要从中提取每个笔画的坐标点数组。代码中通过以下步骤完成:

用 replace 和 split 裁剪出核心 JSON 部分。

用正则 \w:[(.+?)] 匹配到每个笔画的数据块。

进一步从 ‘…’ 字符串中按 # 分割,得到每个笔画的坐标列表。

用 eval 将字符串 (x,y) 转换为元组。

注意:该 API 为第三方免费服务,可能不稳定或变更返回格式,使用时需做好容错。

5.2 坐标缩放与方向调整

坐标统一除以 4:因为 API 返回的坐标数值较大,直接使用会超出画布范围,所以适当缩放。

Y 轴取负:Turtle 坐标系的 Y 轴向上为正,而 API 的 Y 轴向下为正,因此需要翻转。

5.3 多字排布
通过循环调用 draw_words,每画完一个字将 start_x 增加固定值,实现水平排列。

六、运行与调试

首次运行:确保网络连接正常,程序会依次请求每个汉字的笔画数据。如果网络慢或接口无响应,可能会卡住。

常见问题:

requests.exceptions.ConnectionError:检查网络,或更换代理。

IndexError:说明 API 返回格式变化,需要调整解析逻辑。

Turtle 窗口未显示:检查代码末尾是否有 turtle.done()。

七、优化与扩展方向

优化方向 实现思路
本地缓存 将获取到的坐标保存为 JSON 文件,下次直接读取,避免重复请求。
更多字体 尝试其他笔画 API 或使用字体文件提取轮廓(如 Pillow + matplotlib)。
动态书写动画 利用 turtle.ontimer 实现逐笔画的缓慢绘制,更像书法演示。
支持繁体字 选择支持繁体的 API。
图形界面 用 tkinter 或 PyQt 包装成可视化工具,让用户输入文字、选择颜色。

八、总结

本项目将爬虫与 Turtle 绘图巧妙结合,实现了汉字自动书写。虽然 API 数据源存在不确定性,但作为学习项目,它很好地锻炼了以下几方面能力:
1.网络请求与数据解析(requests + re)。
2.坐标系变换(映射 API 坐标到 Turtle 画布)。
3.Turtle 绘图操作(画笔控制、循环绘制)。
你可以基于此代码,尝试绘制自己的名字、喜欢的诗句,甚至制作电子贺卡。如果 API 失效,也可以寻找替代接口(如百度 AI 开放平台的笔顺识别)。最后,欢迎在评论区分享你的运行效果或改进思路!

更多推荐