跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 使用 Turtle 库绘制圣诞树

如何使用 Python 的 turtle 模块绘制一个包含星星、彩灯、雪人和雪花的动态圣诞树。代码采用递归算法构建树形结构,结合随机数生成器实现装饰物的随机分布。文章提供了完整的源代码、环境配置步骤及关键函数的逻辑解析,适合 Python 初学者练习图形化编程与基础算法应用。运行需 Python 3.x 环境,无需额外依赖库。

HadoopMan发布于 2025/2/6更新于 2026/8/2457 浏览
Python 使用 Turtle 库绘制圣诞树

Python 使用 Turtle 库绘制圣诞树

前言

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

环境准备

  1. 确保已安装 Python 3.x 版本。
  2. 无需额外安装第三方库,turtle 和 random 均为标准库。
  3. 推荐使用 PyCharm、VS Code 或 IDLE 作为开发工具。

代码逻辑分析

本程序主要包含以下几个核心部分:

  1. 初始化设置:设置画布大小、背景颜色、画笔速度和粗细。
  2. 五角星绘制:位于树顶,使用循环和角度计算完成。
  3. 递归树形结构:利用递归函数 tree(d, s) 模拟树枝的生长,参数 d 控制深度,s 控制长度。
  4. 随机装饰:包括彩灯(drawlight)和底部装饰球,利用随机数生成位置和颜色。
  5. 雪人绘制:独立函数 drawsnowman,通过坐标定位绘制头部、身体及五官。
  6. 雪花效果:drawsnow 函数在屏幕随机位置绘制六角形雪花,营造冬日氛围。
  7. 文字显示:在画面顶部添加节日祝福文字。

完整源代码

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()  # 完成,否则会直接关闭

运行说明

  1. 将上述代码保存为 .py 文件,例如 christmas_tree.py。
  2. 在终端或命令行中运行 python christmas_tree.py。
  3. 将会弹出一个窗口展示动画效果。

扩展与定制

  • 修改颜色:可调整 t.color() 中的参数改变树木或装饰的颜色。
  • 调整密度:修改 range(200) 中的数字可增加或减少装饰球的数量。
  • 改变速度:t.speed() 的值越大,绘图速度越快,建议设置为 1000 以快速预览。

总结

本示例展示了 Python turtle 库在图形绘制方面的强大能力,结合了递归算法与随机逻辑。通过阅读和修改此代码,学习者可以深入理解函数封装、坐标系统以及事件循环机制。

目录

  1. Python 使用 Turtle 库绘制圣诞树
  2. 前言
  3. 环境准备
  4. 代码逻辑分析
  5. 完整源代码
  6. 初始化设置
  7. 定义画五角星的函数
  8. 定义画彩灯的方法
  9. 定义画树的递归函数
  10. 开始画树
  11. 循环画最底端的小装饰
  12. 定义画雪人的函数
  13. 绘制两个雪人
  14. 添加文字
  15. 定义画雪花的方法
  16. 运行说明
  17. 扩展与定制
  18. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GPT 大模型构建原理与 NLP 技术演进解析
  • 格拉姆角场(GAF)时间序列可视化与特征编码详解
  • 多模态 AI 知识库构建指南
  • Git 国内镜像源下载与安装配置指南
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • Kali Linux 2025.4 在 VMware 中鼠标不显示的解决方法
  • 位图矢量化技术瓶颈突破:Potrace 算法深度解析与应用实践
  • 机器人灵巧操作新突破:学习系鞋带与挂衣服
  • AI Agent 沙箱选型指南:五种隔离架构对比
  • 企业微信可信 IP 配置:无备案域名的 Python 实现
  • Cursor 的代理配置:填一次就生效
  • 前端面试复盘:从基础原理到工程化的核心考察点
  • Resilience4j 熔断降级深度解析:状态机、Fallback 与限流算法
  • 国产 AI 大模型在医疗领域的十大应用场景案例盘点
  • RocksDB 在鲲鹏架构下的性能优化源码解析
  • 昇腾 NPU 部署 Llama 2 模型的性能测试与优化实践
  • SpringBoot 住院管理系统的功能拆解与实现
  • Git 远程仓库操作指南:克隆、推送、拉取与标签管理
  • Cursor 中配置与使用 MCP 服务实战
  • 区块链:时间长河共识算法(Time River Consensus Algorithm)

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online