这篇文章主要介绍了python 基础 详细,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。
使用python和turtle绘制樱花树
一.完整代码
import turtle
import random
import time
# 绘制樱花树的函数
def draw_tree(branch_length, pen):
time.sleep(0.005) # 控制绘制速度
if branch_length > 3:
# 根据枝干长度设置画笔颜色和粗细
if 8 <= branch_length <= 12:
pen.color('lightcoral') # 绿色
pen.pensize(branch_length / 3)
elif branch_length < 8:
pen.color('snow')
pen.pensize(branch_length / 2)
else:
pen.color('sienna') # 赭色
pen.pensize(branch_length / 10)
# 绘制枝干
pen.forward(branch_length)
angle = 1.5 * random.random()
pen.right(20 * angle)
reduce_length = 10 * 1.5 * random.random()
# 递归绘制树枝
draw_tree(branch_length - reduce_length, pen)
(40 * angle)
# 递归绘制花
draw_tree(branch_length - reduce_length, pen)
pen.right(20 * angle)
()
pen.backward(branch_length)
()
# 绘制花瓣的函数
def draw_petals(count, pen):
for i in range(count):
distance = 200 - 400 * random.random()
angle = 10 - 20 * random.random()
()
pen.forward(angle)
(90)
pen.forward(distance)
()
pen.color('lightcoral') # 淡珊瑚色
pen.circle(1)
()
pen.backward(distance)
pen.right(90)
pen.backward(angle)
# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(5, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()
# 隐藏画笔
# pen.hideturtle()
# 移动画笔到起始位置并设置方向
(90)
()
pen.backward(150)
()
pen.color('sienna')
# 绘制樱花树
draw_tree(60, pen)
# 绘制花瓣
draw_petals(200, pen)
# 点击退出
window.exitonclick()
二.代码详解
1.用到的库
turtlerandomtime
Turtle
Turtle 是 Python 中一个简单而有趣的绘图库,它模拟了一只海龟(turtle)在画布上移动的过程,通过控制海龟的移动和画笔的属性,可以实现各种图形的绘制和动画效果ThinkPHP6接口安全性。Turtle 库通常用于教学和初学者入门编程,因为它易于理解和上手,同时也可以用于创建一些简单的图形和动画。
以下是 Turtle 库的一些主要特点和功能:
绘制图形: 可以使用 Turtle 库来绘制各种图形,包括直线、圆形、多边形、矩形等。
控制海龟: 可以控制海龟的移动方向、步长、旋转角度等,从而实现复杂的图形绘制。
画笔属性: 可以设置画笔的颜色、粗细、填充颜色等属性,使得绘制出的图形更加丰富多彩。
动画效果: Turtle 库支持绘制动画效果,通过控制海龟的移动和画笔的属性变化,可以实现各种动态效果。
事件处理: 可以注册事件处理器,例如点击画布时执行特定的函数,从而实现交互式的绘图和动画。
保存图形: 可以将绘制的图形保存为图片文件,例如 PNG、JPEG 等格式。
轨迹记录: Turtle 库可以记录海龟移动的轨迹,从而实现绘制复杂图形的功能。
下面是一个简单的使用 Turtle 库绘制正方形的示例代码:
import turtle
# 创建画布和海龟
window = turtle.Screen()
t = turtle.Turtle()
# 绘制正方形
for _ in range(4):
t.forward(100) # 向前移动100个像素
t.right(90) # 向右旋转90度
# 点击退出
window.exitonclick()
这段代码创建了一个画布和一只海龟,然后使用海龟绘制了一个正方形。点击画布任意位置可以退出绘制。这只是 Turtle 库的一个简单示例,你可以通过探索更多的方法和属性,实现更多有趣的图形和动画效果。 效果:
random
random
是 Python 标准库中的一个模块,用于生成各种随机数,包括整数、浮点数和随机选择序列中的元素等。random
模块提供了一系列函数,可以用于生成随机数,控制随机数的范围和分布,以及实现随机抽样等功能。
以下是 random
模块常用的功能和函数:
生成随机整数:
random.randint(a, b)
: 返回一个包含在闭区间 [a, b]
内的随机整数。random.randrange(start, stop[, step])
: 返回一个在范围 [start, stop)
内按指定步长 step
递增的随机整数。
生成随机浮点数:
random.random()
: 返回一个 0 到 1 之间的随机浮点数。random.uniform(a, b)
: 返回一个在闭区间 [a, b]
内的随机浮点数。
随机选择序列元素:
random.choice(sequence)
: 从序列 sequence
中随机选择一个元素并返回。random.sample(population, k)
: 从总体 population
中随机选择 k
个元素作为样本,并返回一个新列表。
打乱序列:
random.shuffle(sequence)
: 将序列 sequence
中的元素随机打乱顺序。
随机种子:
(a=None)
: 初始化随机数生成器的种子。如果不提供种子 a
,则使用系统时间作为种子,否则使用指定的种子。
通过使用 random
模块,你可以生成各种需要的随机数,实现随机化的功能。等会咱们就要用到random.random()
函数。
time
time
是 Python 标准库中的一个模块,用于处理时间相关的操作,包括获取当前时间、延时等待、时间格式转换等功能。time
模块提供了一系列函数,可以用于获取系统时间、计算时间间隔、格式化时间字符串等操作。
以下是 time
模块常用的功能和函数:
获取当前时间:
()
: 返回当前时间的时间戳(Unix 时间戳,即自 1970 年 1 月 1 日以来的秒数)。time.localtime([seconds])
: 将时间戳转换为本地时间的 struct_time 对象,或者将当前时间转换为 struct_time 对象。
时间格式转换:
time.strftime(format[, t])
: 将 struct_time 对象或时间戳 t
格式化为指定格式的字符串。time.strptime(string, format)
: 将格式化的时间字符串 string
解析为 struct_time 对象。
延时等待:
time.sleep(seconds)
: 让程序休眠指定的时间(秒),用于实现延时操作。
计时器:
time.clock()
: 返回程序运行的 CPU 时间,用于性能分析和计时。
其他功能:
time.gmtime([seconds])
: 将时间戳转换为 UTC 时间的 struct_time 对象。time.monotonic()
: 返回一个单调递增的时钟,用于测量时间间隔,不受系统时间调整的影响。
通过使用 time
模块,你可以在程序中获取和处理时间信息,实现各种时间相关的功能,例如实现定时任务、记录程序运行时间、格式化输出时间信息等。等会咱们用到time.sleep(seconds)
函数。
2.主函数
# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(5, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()
# 隐藏画笔
# pen.hideturtle()
# 移动画笔到起始位置并设置方向
(90)
()
pen.backward(150)
()
pen.color('sienna')
# 绘制樱花树
draw_tree(60, pen)
# 绘制花瓣
draw_petals(200, pen)
# 点击退出
window.exitonclick()
要想画一颗樱花树,首先得有画布 window = turtle.Screen()
是 Python Turtle 模块中用于创建画布(canvas)的函数。它返回一个 TurtleScreen 对象,你可以用这个对象来控制画布的各种属性和行为,比如设置背景颜色、大小,注册事件处理器等等。
window.bgcolor('wheat')
给画布设置成小麦色。
window.tracer(5, 0)
是用于控制绘图窗口(即画布)更新速度的方法。
具体来说,这个方法的参数含义如下:
第一个参数 5
表示设置绘图窗口的更新延迟,即每次绘制之后暂停 5 毫秒。第二个参数 0
表示立即更新绘图窗口,即在每次绘制后立即更新画布显示。
绘图窗口的更新速度控制了绘制图形时的动画效果。通过设置适当的更新延迟,可以控制绘图的流畅度和速度,使得绘制出的图形动画更加真实和连续。
在咱们的代码中,window.tracer(5, 0)
用于控制绘图窗口的更新速度,每次绘制后暂停 5 毫秒,然后立即更新画布显示,从而实现动画效果的控制。
目前画布准备完毕了,然后就需要画笔了,pen = turtle.Turtle()
用于获取一个画笔对象,然后就可以使用这个对象来绘制各种形状和图案,控制画笔的移动、颜色、粗细等属性。
下面是一些常用的 Turtle 方法示例:
移动画笔:
pen.forward(100) # 向前移动100个像素
设置画笔颜色:
pen.color('blue') # 设置画笔颜色为蓝色
设置画笔粗细:
pen.pensize(2) # 设置画笔粗细为2个像素
向左旋转画笔:
(90) # 向左旋转90度
向右旋转画笔:
pen.right(90) # 向右旋转90度
通过使用 Turtle 对象的方法,你可以实现各种绘图操作,例如绘制线条、图形,甚至是复杂的动画效果。
3.draw_tree绘制树干函数
首先咱们先绘制不加转向的树干,其中主要绘制思路就是:将树干分成一段一段的,长的树干比较粗,然后通过递归方法依次将树干长度减少,同时宽度也减少,当长度 branch_length < 20
则开始绘制花朵(就是将颜色设置成红色)当长度20 <= branch_length <= 30
时开始绘制树叶(就是将颜色设置成绿色)否则就是树干的部分了,将颜色设置成褐色。
import turtle
import random
import time
# 绘制樱花树
def draw_tree(branch_length, pen):
time.sleep(1)
if branch_length > 5:
# 根据枝干长度设置画笔颜色和粗细
if 20 <= branch_length <= 30:
pen.color('green') # 绿色
pen.pensize(branch_length / 3)
elif branch_length < 20:
pen.color('pink')
pen.pensize(branch_length / 2)
else:
pen.color('sienna') # 赭色
pen.pensize(branch_length / 10)
# 绘制枝干
pen.forward(branch_length)
# 递归绘制树枝
reduce_length = int(10 * 1.5 * random.random())
print('枝干长度:%s 减去的长度:%s' % (branch_length, reduce_length))
draw_tree(branch_length - reduce_length, pen)
# 设置画布和画笔(返回一个画布对象TurtleScreen )
window = turtle.Screen()
# 设置画布颜色小麦色
window.bgcolor('wheat')
# 控制绘制速度 每次绘制后暂停5毫秒 0代表立刻更新画布
window.tracer(1, 0)
# 用于创建画笔的函数 (返回一个Turtle对象)
pen = turtle.Turtle()
# 移动画笔到起始位置并设置方向
(90)
()
pen.backward(150)
()
pen.color('sienna')
time.sleep(5)
draw_tree(60, pen)
# 点击退出
window.exitonclick()
效果: 下面加上向右偏的代码
pen.forward(branch_length)
angle = 1.5 * random.random()
pen.right(20 * angle)
draw_tree(branch_length - reduce_length, pen)
random.random()
函数返回的随机数取值范围是 [ 0 , 1 ) [0, 1) [0,1),即包括 0 而不包括 1。换句话说,返回的随机数是大于等于 0 且小于 1 的浮点数。所以201.5 [ 0 , 1 ) [0, 1) [0,1)的取值范围就是 [ 0 , 30 ) [0, 30) [0,30) 也就是说树干向右生长最多不超过30度。
效果: 同样的道理,咱们再加上向左生长的代码,这里需要注意以下向左偏移(生长)的度数应该在 [ 0 , 60 ) [0, 60) [0,60)之间了,因为这样整体树干分布左右比较平均。 (40 * angle)
效果: 目前代码:
到这里树干可以向左或向右生长了,然后咱们如何给他们同时加上向右或向左生长的代码呢? 如果同时调用递归绘制就会变成这样: 是不是有点问题,没要按照咱们想象的画完右边画左边,问题就在于向右画完了,提笔,然后后退到上一步的地方,然后落笔,再转向,再次重复上述操作。 后退的代码:pen.right(20 * angle)
()
pen.backward(branch_length)
()
效果: 是不是有一点点像樱花树了,下面咱们再画上落下时花瓣。
4.draw_petals绘制花瓣函数
def draw_petals(count, pen):
for i in range(count):
distance = 200 - 400 * random.random()
angle = 10 - 20 * random.random()
()
pen.forward(angle)
(90)
pen.forward(distance)
()
pen.color('lightcoral') # 淡珊瑚色
pen.circle(1)
()
pen.backward(distance)
pen.right(90)
pen.backward(angle)
这个函数就比较简单了,就是在指定的区域内画园就行了
注:上面画完树干笔会回到树的根部。
首先distance
取值范围是 ( − 200 , 200 ] (-200,200] (−200,200]angle
取值范围是 ( − 10 , 10 ] (-10,10] (−10,10]
()
pen.forward(angle)
然后抬笔,向上移动(因为之前画树时笔的朝向是正上方)angle
的距离
(90)
pen.forward(distance)
再向左移动 distance
距离
()
pen.color('lightcoral')
# 淡珊瑚色pen.circle(1)
接着落笔,画半径为1是园
()
pen.backward(distance)
pen.right(90)
pen.backward(angle)
再然后抬笔回到初始位置
上述操作重复执行指定的次数,就可以画指定个画瓣了。
最后放在一起,一颗漂亮的樱花树就绘制完成啦!
原文地址1:https://blog.csdn.net/weixin_42704512/article/details/138219754
参考资料:python中用turtle画一个圆形 https://blog.csdn.net/SXIAOYAN_/article/details/140061099