Python 使用 Turtle 库绘制圣诞树
前言
Python 的 turtle 模块是一个非常适合初学者学习图形化编程的工具。它通过控制画笔在屏幕上移动来绘制图形,支持递归、随机数等高级特性。本文将介绍如何使用 Python turtle 绘制一棵包含星星、彩灯、雪人和雪花的动态圣诞树。
环境准备
- 确保已安装 Python 3.x 版本。
- 无需额外安装第三方库,
turtle和random均为标准库。 - 推荐使用 PyCharm、VS Code 或 IDLE 作为开发工具。
代码逻辑分析
本程序主要包含以下几个核心部分:
- 初始化设置:设置画布大小、背景颜色、画笔速度和粗细。
- 五角星绘制:位于树顶,使用循环和角度计算完成。
- 递归树形结构:利用递归函数
tree(d, s)模拟树枝的生长,参数d控制深度,s控制长度。 - 随机装饰:包括彩灯(
drawlight)和底部装饰球,利用随机数生成位置和颜色。 - 雪人绘制:独立函数
drawsnowman,通过坐标定位绘制头部、身体及五官。 - 雪花效果:
drawsnow函数在屏幕随机位置绘制六角形雪花,营造冬日氛围。 - 文字显示:在画面顶部添加节日祝福文字。
完整源代码
import turtle as t
import random as r
# 初始化设置
t.speed(1000)
t.pensize(5)
t.screensize(800, 800, bg='black')
t.left(90)
t.forward(250)
# 定义画五角星的函数
n = 100.0
t.color("orange", "yellow")
t.begin_fill()
t.left(126)
for i in range(5):
t.forward(n / 5)
t.right(144)
t.forward(n / 5)
t.left(72)
t.end_fill()
t.right(126)
# 定义画彩灯的方法
def drawlight():
if r.randint(0, 50) == 0:
t.color('tomato')
t.circle(3)
elif r.randint(0, 30) == 1:
t.color('orange')
t.circle(4)
elif r.randint(0, 50) == 2:
t.color('blue')
t.circle(2)
elif r.randint(0, 30) == 3:
t.color('white')
t.circle(4)
else:
pass # 其余情况不画灯
# 定义画树的递归函数
def tree(d, s):
if d <= 0: return
t.forward(s)
tree(d - 1, s * .8)
t.right(120)
tree(d - 3, s * .5)
drawlight() # 同时调用小彩灯的方法
t.right(120)
tree(d - 3, s * .5)
t.right(120)
t.backward(s)
# 开始画树
tree(15, 100)
t.backward(50)
# 循环画最底端的小装饰
for i in range(200):
a = 200 - 400 * r.random()
b = 10 - 20 * r.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
if r.randint(0, 1) == 0:
t.color('tomato')
else:
t.color('wheat')
t.circle(2)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 定义画雪人的函数
def drawsnowman(n, m, a, b):
t.goto(n, m)
t.pencolor("white")
t.pensize(2)
t.fillcolor("white")
t.seth(0)
t.begin_fill()
t.circle(a)
t.end_fill()
t.seth(180)
t.begin_fill()
t.circle(b)
t.end_fill()
t.pencolor("black")
t.fillcolor("black")
t.penup()
# 右眼睛
t.goto(n-a/4, m+a)
t.seth(0)
t.pendown()
t.begin_fill()
t.circle(2)
t.end_fill()
t.penup()
# 左眼睛
t.goto(n+a/4, m+a)
t.seth(0)
t.pendown()
t.begin_fill()
t.circle(2)
t.end_fill()
t.penup()
# 画嘴巴
t.goto(n, m+a/2)
t.seth(0)
t.pendown()
t.fd(5)
t.penup()
# 画扣子
t.pencolor("red")
t.fillcolor("red")
t.goto(n, m-b/4)
t.pendown()
t.begin_fill()
t.circle(2)
t.end_fill()
t.penup()
t.pencolor("yellow")
t.fillcolor("yellow")
t.goto(n, m-b/2)
t.pendown()
t.begin_fill()
t.circle(2)
t.end_fill()
t.penup()
t.pencolor("orange")
t.fillcolor("orange")
t.goto(n, m-(3*b)/4)
t.pendown()
t.begin_fill()
t.circle(2)
t.end_fill()
# 绘制两个雪人
drawsnowman(-200, -200, 20, 30)
drawsnowman(-250, -200, 30, 40)
# 添加文字
t.up()
t.goto(100, 200)
t.down()
t.color("dark red", "red")
t.penup()
t.write("Merry Christmas", font=("Comic Sans MS", 16, "bold"))
t.end_fill()
# 定义画雪花的方法
def drawsnow():
t.ht() # 隐藏笔头
t.pensize(2)
for i in range(200): # 画多少雪花
t.pencolor("white")
t.pu() # 提笔
t.setx(r.randint(-350, 350)) # 定义 x 坐标
t.sety(r.randint(-100, 350)) # 定义 y 坐标
t.pd() # 落笔
dens = 6 # 雪花瓣数设为 6
snowsize = r.randint(1, 10) # 定义雪花大小
for j in range(dens):
t.fd(int(snowsize))
t.backward(int(snowsize))
t.right(int(360 / dens))
drawsnow() # 调用画雪花的方法
t.done() # 完成,否则会直接关闭
运行说明
- 将上述代码保存为
.py文件,例如christmas_tree.py。 - 在终端或命令行中运行
python christmas_tree.py。 - 将会弹出一个窗口展示动画效果。
扩展与定制
- 修改颜色:可调整
t.color()中的参数改变树木或装饰的颜色。 - 调整密度:修改
range(200)中的数字可增加或减少装饰球的数量。 - 改变速度:
t.speed()的值越大,绘图速度越快,建议设置为 1000 以快速预览。
总结
本示例展示了 Python turtle 库在图形绘制方面的强大能力,结合了递归算法与随机逻辑。通过阅读和修改此代码,学习者可以深入理解函数封装、坐标系统以及事件循环机制。


