最近用代码绘制圣诞树的活动非常火,博主整理了目前较为流行的方法,并对豪华版本中部分复杂部分代码补充了注释。所有代码都是使用常见的库,大家不需要花费额外的学习陈本。
〇、turtle库简介
python turtle库是一个绘图库,可以让你在python中使用turtle来绘制图形。它的使用方法非常简单,可以帮助初学者学习编程的基础知识。
首先,需要在你的python环境中安装turtle库。这可以通过在终端中使用命令 "pip install turtle" 来完成。
然后,在你的python代码中导入turtle模块。这可以通过使用 "import turtle" 来完成。
接下来,你就可以使用turtle中的方法来控制小海龟的移动和绘制图形了。例如,你可以使用 "turtle.forward(distance)" 来让海龟向前移动一段距离,使用 "turtle.left(angle)" 来让海龟向左转一个角度,使用 "turtle.right(angle)" 来让海龟向右转一个角度,使用 "turtle.pencolor(color)" 来设置海龟的画笔颜色,使用 "turtle.pensize(size)" 来设置海龟的画笔粗细等。
你还可以使用turtle库中的其他方法来绘制复杂的图形,例如圆、五边形、六边形等。
一、基础版
height = 5 stars = 1 for i in range(height): print((' ' * (height - i)) + ('*' * stars)) stars += 2 print((' ' * height) + '|')
最简单的版本,没有用到各种包,纯字符串打印。
二、进阶版
import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle() square.shape('square') square.color('green') square.speed('fastest') square.up() circle.goto(0,280) circle.stamp() k = 0 for i in range(1, 17): y = 30*i for j in range(i-k): x = 30*j square.goto(x,-y+280) square.stamp() square.goto(-x,-y+280) square.stamp() if i % 4 == 0: x = 30*(j+1) circle.color('red') circle.goto(-x,-y+280) circle.stamp() circle.goto(x,-y+280) circle.stamp() k += 2 if i % 4 == 3: x = 30*(j+1) circle.color('yellow') circle.goto(-x,-y+280) circle.stamp() circle.goto(x,-y+280) circle.stamp() square.color('brown') for i in range(17,20): y = 30*i for j in range(3): x = 30*j square.goto(x,-y+280) square.stamp() square.goto(-x,-y+280) square.stamp() turtle.exitonclick()
使用turtle的版本,很多人Python的兴趣入门都是从python开始的,相信这个对于这个也不存在什么困难。
三、高级版
from turtle import * import random import time n = 80.0 speed("fastest") screensize(bg='seashell') left(90) forward(3*n) color("orange", "yellow") begin_fill() left(126) for i in range(5): forward(n/5) right(144) forward(n/5) left(72) end_fill() right(126) color("dark green") backward(n*4.8) def tree(d, s): if d <= 0: return forward(s) tree(d-1, s*.8) right(120) tree(d-3, s*.5) right(120) tree(d-3, s*.5) right(120) backward(s) tree(15, n) backward(n/2) for i in range(200): a = 200 - 400 * random.random() b = 10 - 20 * random.random() up() forward(b) left(90) forward(a) down() if random.randint(0, 1) == 0: color('tomato') else: color('wheat') circle(2) up() backward(a) right(90) backward(b) time.sleep(60) 在进阶版的基础上,加入了time和random两个常见的包,让图片动起来了。 四、豪华版 import turtle as t # as就是取个别名,后续调用的t都是turtle from turtle import * import random as r import time n = 100.0 t.pensize(10) # 修改画笔大小 speed("fastest") # 定义速度 screensize(bg='black') # 定义背景颜色,可以自己换颜色 left(90) forward(3 * n) color("orange", "yellow") # 定义最上端星星的颜色,外圈是orange,内部是yellow begin_fill() left(126) for i in range(5): # 画五角星 forward(n / 5) right(144) # 五角星的角度 forward(n / 5) left(72) # 继续换角度 end_fill() right(126) def drawlight(): # 定义画彩灯的方法 if r.randint(0, 30) == 0: # 如果觉得彩灯太多,可以把取值范围加大一些,对应的灯就会少一些 color('tomato') # 定义第一种颜色 circle(6) # 定义彩灯大小 elif r.randint(0, 30) == 1: color('orange') # 定义第二种颜色 circle(3) # 定义彩灯大小 else: linewidth = 5 color('dark green') # 其余的随机数情况下画空的树枝 color("dark green") # 定义树枝的颜色 backward(n * 4.8) def tree(d, s): # 开始画树 if d <= 0: return forward(s) tree(d - 1, s * .8) right(120) tree(d - 3, s * .5) drawlight() # 同时调用小彩灯的方法 right(120) tree(d - 3, s * .5) right(120) backward(s) tree(15, n) backward(n / 2) for i in range(200): # 循环画最底端的小装饰 a = 200 - 400 * r.random() b = 10 - 20 * r.random() up() forward(b) left(90) forward(a) down() if r.randint(0, 1) == 0: color('tomato') else: color('wheat') circle(2) up() backward(a) right(90) backward(b) t.color("dark red", "red") # 定义字体颜色 t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold")) # 定义文字、位置、字体、大小 def drawsnow(): # 定义画雪花的方法 t.ht() # 隐藏笔头,ht=hideturtle t.pensize(2) # 定义笔头大小 for i in range(200): # 画多少雪花 t.pencolor("white") # 定义画笔颜色为白色,其实就是雪花为白色 t.pu() # 提笔,pu=penup t.setx(r.randint(-350, 350)) # 定义x坐标,随机从-350到350之间选择 t.sety(r.randint(-100, 350)) # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始 t.pd() # 落笔,pd=pendown dens = 6 # 雪花瓣数设为6 snowsize = r.randint(1, 10) # 定义雪花大小 for j in range(dens): # 就是6,那就是画5次,也就是一个雪花五角星 # t.forward(int(snowsize)) #int()取整数 t.fd(int(snowsize)) t.backward(int(snowsize)) # t.bd(int(snowsize)) #注意没有bd=backward,但有fd=forward,小bug t.right(int(360 / dens)) # 转动角度 drawsnow() # 调用画雪花的方法 t.done() # 完成,否则会直接关闭
并没有引入新的库,但是与高级版相比,绘制的元素更多。