Python 绘制名字
Python Turtle 绘制姓名笔画:爬取汉字坐标,用画笔“写”出你的名字
用代码“写字”听起来很酷吧?本文带你用 Python 的
turtle绘图库,结合网络爬虫获取汉字笔画坐标,实现一个自动绘制任意姓名的趣味工具。从原理到代码,一步步拆解。
前言
用 Python 的乌龟画图(turtle)模块,像书法家一样一笔一划写出汉字?这并不是靠预设的矢量图,而是动态获取汉字的笔画轨迹坐标,然后让画笔沿着这些坐标移动。
本文的灵感来源于一个有趣的工具:通过在线汉字笔画查询 API,获取每个字的笔画顺序和坐标点,再使用 turtle 精确绘制出来。整个项目涉及:
- 网络请求:用
requests获取笔画数据。 - 正则解析:提取坐标点。
- Turtle 绘图:模拟书写过程。
代码虽然不长,但涵盖了 Python 爬虫、数据解析、图形绘制等知识点,非常适合练手。
一、效果展示
运行程序后,会弹出一个 Turtle 窗口,依次绘制出你指定的汉字。例如,输入 好酷王董基,效果类似于:

每个字都会按照其标准笔画顺序“写”出来,笔画颜色和粗细均可自定义。
二、实现原理
2.1 核心思路
- 获取笔画坐标数据:向一个免费的汉字笔画查询 API 发送请求,传入目标汉字,返回该字的笔画轨迹(一系列坐标点)。
- 解析坐标:从返回的 JavaScript 代码中提取出每个笔画的坐标点数组。
- 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 开放平台的笔顺识别)。最后,欢迎在评论区分享你的运行效果或改进思路!
更多推荐
所有评论(0)