python综合实践-利用Python turtle模块画樱花丛

news2024/9/25 15:25:29

目录

一、方法步骤

二、代码实现

三、代码解释

 四、优化代码

五、Python turtle模块介绍

六、Python turtle模块使用方法

创建画布和画笔对象

控制画笔移动和旋转

控制画笔外观

绘制基本图形

控制画布参数


这段代码使用Python turtle模块,利用递归的方式绘制出了5棵樱花树的效果,并在画布上添加了一段文字。主要实现过程如下:

  • 定义了一个名为“Tree(branch, t)”的函数,该函数用于绘制樱花树的躯干和分支。在函数中,通过对画笔颜色、画笔粗细和旋转角度进行设置,使得每次调用自身(递归)时都会绘制出两个较小的分支,最终形成完整的樱花树形状。
  • 初始化画笔对象t,并设置画布大小、背景图片等参数。然后,通过多次调用“Tree()”函数并调整画笔位置和角度,依次绘制出5棵樱花树。
  • 最后,将画笔抬起并移动到适当的位置,使用“write()”函数在画布上写入一段文本。并通过监听画布点击事件,让程序等待用户点击画布后退出,结束整个绘图过程。

 

一、方法步骤

  1. 首先导入需要用到的模块turtle、random、time。
  2. 接着定义一个函数Tree(branch,t),用于绘制樱花树的分支。函数中的branch参数表示分支长度,t参数表示Turtle实例。
  3. 在Tree函数中,首先设置一个适当的绘制速度,每次绘制后递归调用自身前暂停一小段时间,避免绘制过快。然后根据分支长度设置不同的颜色和粗细。当分支长度在8-12之间时,有一定概率绘制白色分支,否则绘制淡珊瑚色分支;当分支长度小于8时,也有一定概率绘制白色分支,否则绘制淡珊瑚色分支;否则绘制赭色(树干)。
  4. 接下来在Tree函数中绘制当前分支。根据随机产生的旋转角度和长度系数,递归调用自身绘制左右两个子分支。注意每次绘制后需要返回到上一层分支处。
  5. 在主程序中,首先创建一个Turtle实例,并进行初始化操作。
  6. 然后使用Turtle实例绘制背景图片,并隐藏画笔。
  7. 设置画笔位置和方向,调用Tree函数绘制五棵樱花树。具体来说,我们将画笔移动到指定位置,下方留出一定空白区域,然后调用Tree函数绘制樱花树。
  8. 绘制文本“愿我们向上生长,如花一般灿烂!!!”,并设置字体颜色和大小。可以使用Turtle实例的write方法在画布上输出文本。
  9. 最后等待用户关闭画布。可以使用Screen类的exitonclick方法实现此功能。

二、代码实现

import turtle as T  # 引入 turtle 库并起一个别名 T
import random  # 引入 random 库
import time  # 引入 time 库

# 画樱花的躯干(60,t)
def Tree(branch, t):
    time.sleep(0.0005)  # 使程序暂停 0.0005 秒,以便视觉效果
    if branch > 3:
        if 8 <= branch <= 12:
            if random.randint(0, 2) == 0:
                t.color('snow')  # 白色
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 3)
        elif branch < 8:
            if random.randint(0, 1) == 0:
                t.color('snow')  # 白色
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 2)
        else:
            t.color('sienna')  # 赭(zhě)色
            t.pensize(branch / 10)  # 笔画宽度为枝干长度的 1/10
        t.forward(branch)  # 前进 branch 的距离
        a = 1.5 * random.random()  # 随机调整角度
        t.right(20 * a)  # 向右旋转一定角度
        b = 1.5 * random.random()  # 随机分支长度
        Tree(branch - 10 * b, t)  # 递归调用自身,绘制左侧小树枝
        t.left(40 * a)  # 向左旋转一定角度
        Tree(branch - 10 * b, t)  # 递归调用自身,绘制右侧小树枝
        t.right(20 * a)  # 向右旋转回原方向
        t.up()  # 抬起画笔
        t.backward(branch)  # 后退 branch 的距离
        t.down()  # 落下画笔,准备绘制下一个小树枝

# 绘图区域
t = T.Turtle()  # 初始化画笔 t
# 画布大小
w = T.Screen()  # 初始化画布 w
t.hideturtle()  # 隐藏画笔
t.getscreen().tracer(5, 0)  # 设置画笔的行进速度和动画开关状态,使得画笔更加流畅
w.bgpic('6a89450a1da14f33a44582542240f48b(1).png')  # 使用背景图片作为画布的背景
t.left(90)  # 向左旋转 90 度
t.up()  # 抬起画笔
t.backward(150)  # 后退 150 的距离
t.down()  # 落下画笔
t.color('sienna')  # 设置画笔颜色为赭(zhě)色
# 画第一棵樱花树
Tree(70, t)  # 枝干长度为 70
Tree(60, t)  # 枝干长度为 60
Tree(40, t)  # 枝干长度为 40
# 画第二棵樱花树
t.up()  # 抬起画笔
t.goto(-350, -300)  # 定位画笔位置
t.setheading(90)  # 设置画笔朝向
t.color('sienna')  # 设置画笔颜色为赭(zhě)色
t.down()  # 落下画笔
Tree(60, t)  # 枝干长度为 60
# 画第三棵樱花树
t.up()  # 抬起画笔
t.goto(350, -300)  # 定位画笔位置
t.setheading(90)  # 设置画笔朝向
t.color('sienna')  # 设置画笔颜色为赭(zhě)色
t.down()  # 落下画笔
Tree(40, t)  # 枝干长度为 40
# 画第四棵樱花树
t.up()  # 抬起画笔
t.goto(300, -300)  # 定位画笔位置
t.setheading(90)  # 设置画笔朝向
t.color('sienna')  # 设置画笔颜色为赭(zhě)色
t.down()  # 落下画笔
Tree(40, t)  # 枝干长度为 40
Tree(20, t)  # 枝干长度为 20
# 画第五棵樱花树
t.up()  # 抬起画笔
t.goto(300, -300)  # 定位画笔位置
t.setheading(90)  # 设置画笔朝向
t.color('sienna')  # 设置画笔颜色为赭(zhě)色
t.down()  # 落下画笔
Tree(20, t)  # 枝干长度为 20
# 绘制文本
t.up()  # 抬起画笔
t.goto(0, -300)  # 定位文本位置
t.color('white')  # 设置文本颜色为白色
t.write("愿我们向上生长,如花一般灿烂!!!", align="center", font=("华文楷体", 30, "bold"))  # 绘制文本
w.exitonclick()  # 点击画布可退出程序

三、代码解释

第 1 行引入 turtle 库并起一个别名 T。

第 2 行引入 random 库。

第 3 行引入 time 库。

第 5~17 行定义函数 Tree(branch, t),接受两个参数:branch 是樱花树的躯干长度,t 是画笔对象。函数中使用递归绘制樱花树的枝干和花朵,其中 time.sleep(0.0005) 使程序暂停 0.0005 秒,以便视觉效果;if 和 elif 语句用于设置不同长度的樱花枝干的颜色、粗细和随机生长方向;最后使用 up() 和 down() 方法控制画笔的行进方向,使得樱花树画完后画笔回到原点。

第 20 行初始化画笔 t。

第 22 行初始化画布 w,并设置画笔的行进速度和动画开关状态。

第 23 行使用 bgpic() 方法设置背景图片作为画布的背景。

第 24~28 行左转 90 度、将画笔提起并向后移动 150、放下画笔、设置画笔颜色,分别控制第一棵樱花树的绘制。

第 29~32 行使用 up() 和 down() 方法、setheading() 方法和颜色设置,控制第二棵樱花树的绘制。

第 33~36 行使用 up() 和 down() 方法、setheading() 方法和颜色设置,控制第三棵樱花树的绘制。

第 37~41 行使用 up() 和 down() 方法、setheading() 方法和颜色设置,控制第四棵樱花树的绘制。

第 42~44 行使用 up() 和 down() 方法、setheading() 方法和颜色设置,控制第五棵樱花树的绘制。

最后三行使用 up() 和 goto() 方法定位文本位置,使用 write() 方法绘制文本,使用 exitonclick() 方法使得点击画布可以退出程序。

 四、优化代码

import turtle as T
import random
import time

# 画樱花的躯干(60,t)
def Tree(branch, t):
    time.sleep(0.0005)
    if branch > 3:
        if 8 <= branch <= 12:
            if random.randint(0, 2) == 0:
                t.color('snow')  # 白
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 3)
        elif branch < 8:
            if random.randint(0, 1) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 2)
        else:
            t.color('sienna')  # 赭(zhě)色
            t.pensize(branch / 10)  # 6
        t.forward(branch)
        a = 1.5 * random.random()
        t.right(20 * a)
        b = 1.5 * random.random()
        Tree(branch - 10 * b, t)
        t.left(40 * a)
        Tree(branch - 10 * b, t)
        t.right(20 * a)
        t.up()
        t.backward(branch)
        t.down()

# 绘图区域
t = T.Turtle()
# 画布大小
w = T.Screen()
t.hideturtle()  # 隐藏画笔
t.getscreen().tracer(5, 0)
w.bgpic('6a89450a1da14f33a44582542240f48b(1).png')
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')

# 定义绘制樱花树的函数
def draw_tree(x, height, t):
    t.up()
    t.goto(x, -300)
    t.setheading(90)
    t.color('sienna')
    t.down()
    Tree(height, t)
# 绘制五棵樱花树
draw_tree(-400, 65, t)
draw_tree(-250, 50, t)
draw_tree(-10, 30, t)
draw_tree(-50, 40, t)
draw_tree(0, 45, t)
draw_tree(100, 40, t)
draw_tree(200, 30, t)
draw_tree(300, 38, t)
draw_tree(400, 30, t)
draw_tree(500, 38, t)
draw_tree(600, 45, t)
# 绘制文本
t.up()
t.goto(0, -300)
t.color('white')
t.write("愿我们向上生长,如花一般灿烂!!!", align="center", font=("华文楷体", 30, "bold"))
w.exitonclick()

第二版代码在第一版的基础上做了以下修改:

  1. 将绘制樱花树的代码抽象成一个函数,减少了代码的重复性,提高了代码的复用性。
  2. 增加了更多的樱花树,让场景更加丰富。
  3. 定义了更加清晰的函数参数,增强了代码的可读性。
  4. 删除了一些冗余的代码,使得代码更加简洁明了。

五、Python turtle模块介绍

Python turtle模块是一个图形化编程工具,可以在屏幕上绘制各种图形。使用turtle模块可以方便快捷地实现基础的图形绘制和动画效果,非常适合用于教育、艺术设计等领域的开发和学习。

在turtle模块中,通过创建一个代表“画笔”的turtle对象,并使用该对象的各种方法来控制移动、旋转、绘制等行为,最终实现所需的图形效果。同时,turtle模块还提供了许多有用的功能,如颜色和线条粗细设置、图案填充、文本输出等等。

除了直接使用Python的turtle模块外,还可以使用一些基于turtle模块封装的第三方库,如pygal、turtle-graph、turtleplot等。这些库提供了更加丰富的功能和更加易于使用的接口,可以方便地实现各种复杂图形的绘制和动画效果。

六、Python turtle模块使用方法

  • 创建画布和画笔对象

import turtle

# 创建屏幕和画笔对象
screen = turtle.Screen()
t = turtle.Turtle()
  • 控制画笔移动和旋转

# 向前移动10个像素单位
t.forward(10)

# 向后移动10个像素单位
t.backward(10)

# 向左旋转90度
t.left(90)

# 向右旋转90度
t.right(90)
  • 控制画笔外观

# 设置画笔颜色为红色
t.color("red")

# 设置画笔粗细为5个像素单位
t.pensize(5)

# 设置画笔填充颜色为蓝色
t.fillcolor("blue")
  • 绘制基本图形

# 在屏幕上绘制一个正方形
for i in range(4):
    t.forward(100)
    t.left(90)

# 在屏幕上绘制一个圆形
t.circle(50)
  • 控制画布参数

# 设置画布的背景颜色为白色
screen.bgcolor("white")

# 设置画布的大小为800x600像素单位
screen.setup(800, 600)

# 隐藏画笔
t.hideturtle()

本篇文章介绍了一种使用Python绘制樱花树的方法,主要使用了turtle模块。文章详细讲述了代码的实现过程,并提供了第二版代码和代码解释,以及Python turtle模块的介绍和使用方法。其中包括创建画布和画笔对象、控制画笔移动和旋转、控制画笔外观以及绘制基本图形等操作。同时,还介绍了一些控制画布参数的方法,如设置背景图片、隐藏画笔等。通过这篇文章,读者可以了解到如何使用turtle模块实现绘图,并能够尝试自己绘制出各种有趣的图形。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端实现消息推送、即时通信、SSE、WebSocket、http简介

信息推送 服务端主动向客户端推送消息&#xff0c;使客户端能够即时接收到信息。 场景 页面接收到点赞&#xff0c;消息提醒聊天功能弹幕功能实时更新数据功能 实现即时通讯方式 短轮询 浏览器&#xff08;客户端&#xff09;每隔一段时间向服务器发送http请求&#xff0c;…

leetcode47. 全排列 II(回溯算法-java)

全排列 II leetcode47. 全排列 II题目描述解题思路代码演示 回溯算法专题 leetcode47. 全排列 II 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations-ii 题目描述 给定一个可包含重复数字的序列 nums &#xf…

Vulnhub: Corrosion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.130 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 目录爆破 blog-post目录下存在两个目录 对archives目录中的randylogs.php进行测试发现存在文件包含 wfuzz -c -w /op…

POI设置日期类型时间约束createDateConstraint不生效了

背景 在使用 POI 导出 excel 时间类型加入时间约束时&#xff0c;发生了使用 Excel 打开无法正确使用时间约束的问题&#xff0c;但是在 永中Office 打开可以使用 关键词 helper.createDateConstraint&#xff0c;POI设置时间约束 设置时间约束的代码如下 该代码是有问题的&…

浏览器渲染流程

解析HTML&#xff0c;生成DOM树&#xff0c;解析CSS&#xff0c;生成CSSOM树 将DOM树和CSSOM树结合&#xff0c;生成渲染树(Render Tree) Layout(回流):根据生成的渲染树&#xff0c;进行回流(Layout)&#xff0c;得到节点的几何信息&#xff08;位置&#xff0c;大小&#x…

MySQL实战解析底层---为什么我的MySQL会“抖“一下

目录 前言 SQL语句为什么变“慢”了 InnoDB刷脏页的控制策略 前言 一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持续时间还很…

STM32挂载SD卡基于Fatfs文件系统读取文件信息

STM32挂载SD卡基于Fatfs文件系统读取文件信息 &#x1f516;本例程基于正点原子标准库修改而来。 &#x1f4cd;FatFs 相关API函数网站&#xff1a;http://elm-chan.org/fsw/ff/00index_e.html &#x1f334;分别测试了SD卡模块以及Mini SD卡模块。 &#x1f33f;STM32f1单片…

代码随想录二刷day29 | 回溯之 491.递增子序列 46.全排列 47.全排列 II

day29 491.递增子序列回溯三部曲 46.全排列回溯三部曲 47.全排列 II 491.递增子序列 题目链接 解题思路&#xff1a; 回溯三部曲 递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&#xff0c;调整下一层递归的起始位置。…

【Python 基础篇】Python各种运算符详解

文章目录 引言一、算术运算符二、比较运算符三、逻辑运算符四、赋值运算符总结 引言 在 Python 编程中&#xff0c;运算符是用于执行各种数学和逻辑操作的特殊符号。它们使我们能够对变量和值进行各种计算和比较。本篇博客将深入探讨 Python 中的常见运算符&#xff0c;并通过…

【如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件,然后解压】

如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件&#xff0c;然后解压 问题描述 DDR-dataset.zip.01、DDR-dataset.zip.02、DDR-dataset.zip.03、…、DDR-dataset.zip.010&#xff0c;如何将他们合并到一起并解压&#xff1f; 解决方法 Windows 系统 在Windo…

原生Jdbc获取库、表、字段

文章目录 一、简介1、概述2、Jdbc获取连接3、执行器 二、获取链接1、获取链接2、关闭连接3、Statement4、PrepatedStatement5、 ResultSet6、ResultSetMetaData 三、执行SQL2.1 增/删/改2.2 查询 四、获取库、表结构1、获取Catalog2、获取库列表3、获取表名4、获取字段 一、简介…

为什么本地部署的低代码平台更有优势?

编者按&#xff1a;快速发展的企业需要跟上不断变化的市场趋势。在这种环境下&#xff0c;低代码开发平台可以成为企业快速进入市场的利器。低代码开发的优势可以影响新软件的交付速度&#xff0c;而可视化开发是推动这种无与伦比的速度的关键功能。私有化部署方案和源码交付机…

27-2BP_Adaboost强分类器公司财务预管建模——强分类器和弱分类器(附matlab程序)

1.简述 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为&#xff1a;首先给出弱学习算法和样本空间&#xff08;x,y&#xff09;&#xff0c;从样本空间中找出m组训练数据&#xff0c;每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次&am…

SIP协议学习笔记

SIP 协议(Session initialization Protocol)会话发起协议 是IETF制定的多媒体通信协议&#xff0c;是一个基于文本的应用层控制协议&#xff0c;用于建立&#xff0c;修改和终止IP网上的双方或多方的多媒体会话,支持代理、重定向、登记定位用户等功能 支持用户的移动&#xff…

Packet Tracer - 使用思科 IOS 配置 DHCP

Packet Tracer - 使用思科 IOS 配置 DHCP 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 192.168.10.1 255.255.255.0 不适用 S0/0/0 10.1.1.1 255.255.255.252 不适用 R2 G0/0 192.168.20.1 255.255.255.0 不适用 G0/1 已分配 DHCP 已分配 …

python安装/卸载模块方法步骤详解(附详细图解)

在日常工作中会需要安装或者卸载Python模块.于是我整理了一下,下面这篇文章主要给大家介绍了关于python安装/卸载模块的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下 以pygame模块举例 1&#xff0c;通过pycharm导入 &#xff08;1&#xff09;直接点击install …

Redis 2023面试5题(三)

一、Redis集群数据hash分片算法是怎么回事&#xff1f; Redis集群数据hash分片算法是一种将数据分散存储在不同的节点上来实现的机制。具体来说&#xff0c;Redis集群将数据分成16384个槽位&#xff0c;每个槽位对应一个节点。当需要访问某个key时&#xff0c;Redis会根据key的…

nginx主配置文件及实战案例

文章目录 一.nginx主配置文件nginx.conf1.认识nginx服务的主配置文件2.全局配置3.I/O事件配置4.HTTP配置&#xff15;.检查配置文件是否正确&#xff16;.浏览器测试&#xff17;.总配置文件图示&#xff17;.1 nginx总配置文件的三个模块&#xff17;.2 HTTP文件配置的图示&am…

【Matlab】语音信号分析与处理实验报告

一、目的 使用Matlab分析与设计实验&#xff0c;理解与掌握以下知识点&#xff1a; 1、信号的采样、频谱混叠 2、信号的频谱分析 3、信号的幅度调制与解调方法 4、理想滤波器的时域和频域特性 5、数字滤波器的设计与实现 二、内容 1、录制一段个人的语音信号 2、采用合适的频…

Unity3D制作一个会移动的方块(还不会移动照相机)

学习Unity3D这么久了&#xff0c;如果你还不会制作一个按下WASD就可以移动的方块的话&#xff0c;那么你的学习将没有一点成就感&#xff0c;我学习的时候&#xff0c;我决定先学习移动&#xff0c;这样我就会对Unity更加感兴趣&#xff0c;学习起来的动力会更为充足 先创建一…