字符田字格绘制
本文最后更新于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)

运行结果如下所示:

拓展

添加复杂参数

可以在上述代码的基础上添加以下功能:

  1. 支持更复杂的绘制样式:边框字符可配置;
  2. 支持每个格子中填入不同字符内容;
  3. 支持每格多行显示:可设置每格高度;

代码所涉及的参数如下:

  • 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知识。

原文作者:© 风影 版权所有


原文链接:https://sily.showbyte.top/tzg-draw/


本作品采用 CC BY-NC-ND 4.0 许可协议。禁止修改原文内容,引用时务必注明文章标题、原文链接及作者信息


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇