本文最后更新于221 天前,如有错误请发送邮件到yaoshengliy@gmail.com
前言
时间:4月3日
题目:P196 5.1 字符田字格绘制

题目分析与方法
1.每个田字格由多个“单元格”组成,每个单元格有:
- 顶部边框(如:
+---+---+) - 中部空格和竖线(如:
| | |) - 底部横线(在下一行绘制)
2.每一行格子都需要两部分输出:
- 一行横向的分隔线;
- 一行竖线和空格填充区域。
3.最后一行横向分隔线在所有行画完后再画一次,闭合整体结构。
4.为实现灵活性,函数应接受一个参数:田字格的宽度。
基本代码实现较为简单,使用简单循环即可,由于字符‘-’与字符‘|’的宽度不同,为了美观,我使用一个字符‘|’来代表竖线,代码如下所示:
def draw_tianzige(n):
# 绘制田字格的横线部分
for row in range(n + 1):
print('+' + ('---+' * n)) # 每格之间用 "---" 表示横线
if row < n:
# 每一行中间的竖线部分
for _ in range(1): # 每格中间可以调多行字符
print('|' + (' |' * n)) # 每格之间用 " " 表示空白
# 绘制一个 5x5 的田字格
draw_tianzige(5)
运行结果如下所示:

拓展
添加复杂参数
可以在上述代码的基础上添加以下功能:
- 支持更复杂的绘制样式:边框字符可配置;
- 支持每个格子中填入不同字符内容;
- 支持每格多行显示:可设置每格高度;
代码所涉及的参数如下:
- n: 田字格的格数(行和列)
- cell_width: 每格宽度(字符数)
- cell_height: 每格高度(行数)
- fill: 一个 n x n 的二维列表,表示每个格子的字符内容
- h_line, v_line, corner: 自定义边框字符
代码如下:
def draw_tianzige(n, cell_width=3, cell_height=1, fill=None,
h_line='-', v_line='|', corner='+'):
"""
绘制任意大小的田字格(n x n),支持自定义样式和格子内容。
参数:
- n: 田字格的格数(行和列)
- cell_width: 每格宽度(字符数)
- cell_height: 每格高度(行数)
- fill: 一个 n x n 的二维列表,表示每个格子的字符内容
- h_line, v_line, corner: 自定义边框字符
"""
for row in range(n):
# 顶部边框
print(corner + ( (h_line * cell_width + corner) * n ))
# 中间内容区域
for h in range(cell_height):
line = ""
for col in range(n):
content = ''
if fill and row < len(fill) and col < len(fill[row]):
# 获取该格的填充内容
text = str(fill[row][col])
content = text.center(cell_width) # 居中
else:
content = ' ' * cell_width
line += v_line + content
line += v_line
print(line)
# 最底部边框
print(corner + ( (h_line * cell_width + corner) * n ))
可以使用多种不同调用方法来运行代码,如:
draw_tianzige(5) # 默认空格
此代码结果同上文基本代码实现结果一致。
fill_data = [
['A', 'B', 'C', 'D'],
['1', '2', '3', '4'],
['5', '6', '7', '8'],
['E', 'F', 'G', 'H'],
]
draw_tianzige(4, fill=fill_data) # 带内容填充
此参数调用方法采用带内容填充,结果如下:

draw_tianzige(3, cell_width=5, cell_height=2, fill=[
['One', 'Two', 'Three'],
['Four', 'Five', 'Six'],
['Seven', 'Eight', 'Nine']
], h_line='=', v_line='‖', corner='*') # 更大格子 + 自定义边框样式
此参数调用方法使用了自定义边框符号,以及更大的格子,并且支持内容填充,结果如下:

模拟书写
我将使用Python中的Pillow库来进行模拟汉字书写:
- 绘制完整的田字格背景;
- 在每个格子中按路径画出简单汉字;
- 输出为图像(可以显示或保存);
代码如下:
from PIL import Image, ImageDraw, ImageFont
def draw_tianzige_with_strokes(text, cell_size=150, padding=30, save_path='tianzige.png'):
"""
在完整田字格中模拟汉字笔画绘制(静态),输出图像。
参数:
- text: 要绘制的汉字字符串
- cell_size: 每个格子的像素大小
- padding: 每格内的边距
- save_path: 图像保存路径
"""
import math
# 自动计算格子行列数或指定格子行列数
n = math.ceil(len(text) ** 0.5)
img_size = cell_size * n
img = Image.new('RGB', (img_size, img_size), 'white')
draw = ImageDraw.Draw(img)
# 田字格线绘制
for i in range(n + 1):
offset = i * cell_size
draw.line([(offset, 0), (offset, img_size)], fill='black', width=2)
draw.line([(0, offset), (img_size, offset)], fill='black', width=2)
# 细线:中线
for i in range(n):
cx = i * cell_size + cell_size // 2
draw.line([(cx, 0), (cx, img_size)], fill='gray', width=1)
draw.line([(0, cx), (img_size, cx)], fill='gray', width=1)
# 加载字体(系统需有支持中文字体)
# 指定一个本地已存在的支持中文的字体路径
font_path = "C:/Windows/Fonts/simhei.ttf" # Windows 上的黑体
try:
font = ImageFont.truetype(font_path, cell_size - 2 * padding)
except OSError:
raise RuntimeError(f"无法加载字体,请确保路径正确并支持中文:{font_path}")
# 写入文字
for idx, char in enumerate(text):
row, col = divmod(idx, n)
x = col * cell_size + padding
y = row * cell_size + padding
draw.text((x, y), char, font=font, fill='black')
img.save(save_path)
img.show()
draw_tianzige_with_strokes("厚德笃学")
代码最终结果如下:

结语
本次对于田字格的绘制与拓展,使我加深了对Python函数调用以及相关库使用的认知与技巧,“人生苦短、我用Python”,希望在后续能继续学习更多有关Python知识。






