Python 使用 Turtle 库绘制圣诞树
前言
Python 的 turtle 模块是一个非常适合初学者学习图形化编程的工具。它通过控制画笔在屏幕上移动来绘制图形,支持递归、随机数等高级特性。本文将介绍如何使用 Python turtle 绘制一棵包含星星、彩灯、雪人和雪花的动态圣诞树。
环境准备
- 确保已安装 Python 3.x 版本。
本文介绍了如何使用 Python 的 turtle 模块绘制一个包含星星、彩灯、雪人和雪花的动态圣诞树。代码采用递归算法构建树形结构,结合随机数生成器实现装饰物的随机分布。文章提供了完整的源代码、环境配置步骤及关键函数的逻辑解析,适合 Python 初学者练习图形化编程与基础算法应用。运行需 Python 3.x 环境,无需额外依赖库。

Python 的 turtle 模块是一个非常适合初学者学习图形化编程的工具。它通过控制画笔在屏幕上移动来绘制图形,支持递归、随机数等高级特性。本文将介绍如何使用 Python turtle 绘制一棵包含星星、彩灯、雪人和雪花的动态圣诞树。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
turtle 和 random 均为标准库。本程序主要包含以下几个核心部分:
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 库在图形绘制方面的强大能力,结合了递归算法与随机逻辑。通过阅读和修改此代码,学习者可以深入理解函数封装、坐标系统以及事件循环机制。