[Python] 用 turtle 来绘制北欧五国的国旗

37 阅读7分钟

背景

turtle — Turtle graphics 中提供了关于 turtle\text{turtle} 模块的介绍。我想用 turtle\text{turtle} 来生成些简单的图案,以巩固学习的效果。北欧五国(即,瑞典、芬兰、挪威、丹麦、冰岛)的国旗图案比较简单,可以从这些国旗开始

要点

北欧五国的位置如下图所示

image.png

这五个国家的国旗是这样的 ⬇️

image.png

考虑到瑞典、芬兰、丹麦的国旗的模式更为简单,本文会先分析瑞典国旗的绘制方法。有了瑞典国旗作为基础,只需要对代码做少量修改,就可以画出芬兰国旗和丹麦国旗。

在此基础上,我们可以画出挪威国旗和冰岛国旗。

正文

瑞典国旗

基本数据

根据 Sweden 网页所提供的信息,瑞典国旗中各部分的比例如下图所示

image.png

我在别的网站上搜到了瑞典国旗中,蓝色和黄色的具体数值(下图中给出了两组数值,我们就用 NCS\text{NCS} 那一组吧)。

image.png

代码

我的整体思路是这样的 ⬇️

  1. 先画出一个蓝色的矩形
  2. 再画出黄色十字的那一横
  3. 再画出黄色十字的那一竖

在此基础上,可以写出完整的 Python\text{Python} 代码 ⬇️ (trae 提供了一些帮助)

import turtle

# ===================== 常量定义 =====================
BLUE = "#005583"
YELLOW = "#FFC200"

# 瑞典国旗的比例(5:2:9 / 4:2:4)
LEFT_FIELD = 5
CROSS_WIDTH = 2
RIGHT_FIELD = 9
TOP_FIELD = 4
BOTTOM_FIELD = 4

RATIO = 40
WIDTH = (LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD) * RATIO
HEIGHT = (TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD) * RATIO


def draw_rectangle(start_x, start_y, width, height, color):
    turtle.teleport(start_x, start_y)
    turtle.setheading(0)

    turtle.color(color, color)
    with turtle.fill():
        for side in (width, height, width, height):
            turtle.forward(side)
            turtle.right(90)


def main():
    # 蓝色背景
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2,
        WIDTH, HEIGHT, BLUE
    )
    # 黄色水平横条
    draw_rectangle(
        -WIDTH // 2, (CROSS_WIDTH * RATIO) // 2,
        WIDTH, CROSS_WIDTH * RATIO, YELLOW
    )
    # 黄色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO, HEIGHT // 2,
        CROSS_WIDTH * RATIO, HEIGHT, YELLOW
    )

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} 程序保存为 draw_sweden_national_flag.py\text{draw\_sweden\_national\_flag.py}。使用如下命令可以运行 draw_sweden_national_flag.py\text{draw\_sweden\_national\_flag.py}

python3 draw_sweden_national_flag.py

运行时的效果示意图如下

image.png

最终的效果如下

image.png

芬兰国旗

基本数据

根据 Finland 网页所提供的信息,芬兰国旗中各部分的比例如下图所示

image.png

我在别的网站上搜到了芬兰国旗中,白色和蓝色的具体数值 ⬇️

image.png

代码

上文已经展示了瑞典国旗的绘制方式,我们可以用类似的方式来绘制芬兰国旗 ⬇️

  1. 先画出一个白色的矩形
  2. 再画出蓝色十字的那一横
  3. 再画出蓝色十字的那一竖

在此基础上,可以写出完整的 Python\text{Python} 代码 ⬇️ (trae 提供了一些帮助)

import turtle

# ===================== 常量定义 =====================
WHITE = "#FFFFFF"
BLUE = "#002F6C"

# 芬兰国旗的比例(5:3:10 / 4:3:4)
LEFT_FIELD = 5
CROSS_WIDTH = 3
RIGHT_FIELD = 10
TOP_FIELD = 4
BOTTOM_FIELD = 4

RATIO = 30
WIDTH = (LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD) * RATIO
HEIGHT = (TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD) * RATIO


def draw_rectangle(start_x, start_y, width, height, color):
    turtle.teleport(start_x, start_y)
    turtle.setheading(0)

    if color == WHITE:
        turtle.color("black", color)
    else:
        turtle.color(color, color)
    with turtle.fill():
        for side in (width, height, width, height):
            turtle.forward(side)
            turtle.right(90)


def main():
    # 白色背景
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2,
        WIDTH, HEIGHT, WHITE
    )
    # 蓝色水平横条
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2 - TOP_FIELD * RATIO,
        WIDTH, CROSS_WIDTH * RATIO, BLUE
    )
    # 蓝色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO, HEIGHT // 2,
        CROSS_WIDTH * RATIO, HEIGHT, BLUE
    )

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} 程序保存为 draw_finland_national_flag.py\text{draw\_finland\_national\_flag.py}。使用如下命令可以运行 draw_finland_national_flag.py\text{draw\_finland\_national\_flag.py}

python3 draw_finland_national_flag.py

运行时的效果示意图如下

image.png

最终的效果如下

image.png

丹麦国旗

基本数据

根据 Denmark 网页所提供的信息,丹麦国旗中各部分的比例如下图所示

image.png

我在别的网站上搜到了丹麦国旗中,红色、白色的具体数值 ⬇️

image.png

代码

上文已经展示了瑞典国旗和芬兰国旗的绘制方式,我们可以用类似的方式来绘制丹麦国旗 ⬇️

  1. 先画出一个红色的矩形
  2. 再画出白色十字的那一横
  3. 再画出白色十字的那一竖

在此基础上,可以写出完整的 Python\text{Python} 代码 ⬇️ (trae 提供了一些帮助)

import turtle

# ===================== 常量定义 =====================
RED = "#D21034"
WHITE = "#FFFFFF"


# 丹麦国旗的比例(12:4:21 / 12:4:12)
LEFT_FIELD = 12
CROSS_WIDTH = 4
RIGHT_FIELD = 21
TOP_FIELD = 12
BOTTOM_FIELD = 12

RATIO = 10
WIDTH = (LEFT_FIELD + CROSS_WIDTH + RIGHT_FIELD) * RATIO
HEIGHT = (TOP_FIELD + CROSS_WIDTH + BOTTOM_FIELD) * RATIO


def draw_rectangle(start_x, start_y, width, height, color):
    turtle.teleport(start_x, start_y)
    turtle.setheading(0)

    turtle.color(color, color)
    with turtle.fill():
        for side in (width, height, width, height):
            turtle.forward(side)
            turtle.right(90)


def main():
    # 红色背景
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2,
        WIDTH, HEIGHT, RED
    )
    # 白色水平横条
    draw_rectangle(
        -WIDTH // 2, (CROSS_WIDTH * RATIO) // 2,
        WIDTH, CROSS_WIDTH * RATIO, WHITE
    )
    # 白色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO, HEIGHT // 2,
        CROSS_WIDTH * RATIO, HEIGHT, WHITE
    )

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} 程序保存为 draw_denmark_national_flag.py\text{draw\_denmark\_national\_flag.py}。使用如下命令可以运行 draw_denmark_national_flag.py\text{draw\_denmark\_national\_flag.py}

python3 draw_denmark_national_flag.py

运行时的效果示意图如下

image.png

最终的效果如下

image.png

挪威国旗

基本数据

根据 Norway 网页所提供的信息,挪威国旗中各部分的比例如下图所示

image.png

image.png

我在别的网站上搜到了挪威国旗中,红色、白色和蓝色的具体数值 ⬇️

image.png

代码

上文已经展示了瑞典国旗、芬兰国旗、丹麦国旗的绘制方式,我们可以用类似的方式来绘制挪威国旗 ⬇️

  1. 先画出一个红色的矩形
  2. 再画出白色十字
  3. 再画出蓝色十字

在此基础上,可以写出完整的 Python\text{Python} 代码 ⬇️ (trae 提供了一些帮助)

import turtle

# ===================== 常量定义 =====================
WHITE = "#FFFFFF"
BLUE = "#003698"
RED = "#D21034"

# 挪威国旗的比例(6:1:2:1:12 / 6:1:2:1:6)
LEFT_FIELD = 6
BIG_CROSS_WIDTH = 4
SMALL_CROSS_WIDTH = 2
CROSS_GAP_WIDTH = 1
RIGHT_FIELD = 12
TOP_FIELD = 6
BOTTOM_FIELD = 6

RATIO = 30
WIDTH = (LEFT_FIELD + BIG_CROSS_WIDTH + RIGHT_FIELD) * RATIO
HEIGHT = (TOP_FIELD + BIG_CROSS_WIDTH + BOTTOM_FIELD) * RATIO


def draw_rectangle(start_x, start_y, width, height, color):
    turtle.teleport(start_x, start_y)
    turtle.setheading(0)

    turtle.color(color, color)
    with turtle.fill():
        for side in (width, height, width, height):
            turtle.forward(side)
            turtle.right(90)


def main():
    # 红色背景
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2,
        WIDTH, HEIGHT, RED
    )
    # 白色水平横条
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2 - TOP_FIELD * RATIO,
        WIDTH, BIG_CROSS_WIDTH * RATIO, WHITE
    )
    # 白色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO, HEIGHT // 2,
        BIG_CROSS_WIDTH * RATIO, HEIGHT, WHITE
    )
    # 蓝色水平横条
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2 - TOP_FIELD * RATIO - CROSS_GAP_WIDTH * RATIO,
        WIDTH, SMALL_CROSS_WIDTH * RATIO, BLUE
    )
    # 蓝色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO
        + CROSS_GAP_WIDTH * RATIO, HEIGHT // 2,
        SMALL_CROSS_WIDTH * RATIO, HEIGHT, BLUE
    )

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} 程序保存为 draw_norway_national_flag.py\text{draw\_norway\_national\_flag.py}。使用如下命令可以运行 draw_norway_national_flag.py\text{draw\_norway\_national\_flag.py}

python3 draw_norway_national_flag.py

运行时的效果示意图如下

image.png

最终的效果如下

image.png

冰岛国旗

基本数据

根据 Iceland 网页所提供的信息,冰岛国旗中各部分的比例如下图所示

image.png

我在别的网站上搜到了挪威国旗中,红色、白色和蓝色的具体数值 ⬇️

image.png

代码

上文已经展示了挪威国旗的绘制方式,我们可以用类似的方式来绘制冰岛国旗 ⬇️

  1. 先画出一个蓝色的矩形
  2. 再画出白色十字
  3. 再画出红色十字

在此基础上,可以写出完整的 Python\text{Python} 代码 ⬇️ (trae 提供了一些帮助)

import turtle

# ===================== 常量定义 =====================
WHITE = "#FFFFFF"
BLUE = "#02529C"
RED = "#DC1E35"

# 冰岛国旗的比例(7:1:2:1:14 / 7:1:2:1:7)
LEFT_FIELD = 7
BIG_CROSS_WIDTH = 4
SMALL_CROSS_WIDTH = 2
CROSS_GAP_WIDTH = 1
RIGHT_FIELD = 14
TOP_FIELD = 7
BOTTOM_FIELD = 7

RATIO = 20
WIDTH = (LEFT_FIELD + BIG_CROSS_WIDTH + RIGHT_FIELD) * RATIO
HEIGHT = (TOP_FIELD + BIG_CROSS_WIDTH + BOTTOM_FIELD) * RATIO


def draw_rectangle(start_x, start_y, width, height, color):
    turtle.teleport(start_x, start_y)
    turtle.setheading(0)

    turtle.color(color, color)
    with turtle.fill():
        for side in (width, height, width, height):
            turtle.forward(side)
            turtle.right(90)


def main():
    # 蓝色背景
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2,
        WIDTH, HEIGHT, BLUE
    )
    # 白色水平横条
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2 - TOP_FIELD * RATIO,
        WIDTH, BIG_CROSS_WIDTH * RATIO, WHITE
    )
    # 白色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO, HEIGHT // 2,
        BIG_CROSS_WIDTH * RATIO, HEIGHT, WHITE
    )
    # 红色水平横条
    draw_rectangle(
        -WIDTH // 2, HEIGHT // 2 - TOP_FIELD * RATIO - CROSS_GAP_WIDTH * RATIO,
        WIDTH, SMALL_CROSS_WIDTH * RATIO, RED
    )
    # 红色垂直竖条
    draw_rectangle(
        -WIDTH // 2 + LEFT_FIELD * RATIO
        + CROSS_GAP_WIDTH * RATIO, HEIGHT // 2,
        SMALL_CROSS_WIDTH * RATIO, HEIGHT, RED
    )

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上 Python\text{Python} 程序保存为 draw_iceland_national_flag.py\text{draw\_iceland\_national\_flag.py}。使用如下命令可以运行 draw_iceland_national_flag.py\text{draw\_iceland\_national\_flag.py}

python3 draw_iceland_national_flag.py

运行时的效果示意图如下

image.png

最终的效果如下

image.png

参考资料