共用到四个要素即四个class,分别是山头、雪、太阳、樱花,另外程序需要一个主类分别调用它们,并起到一个初始化画笔、画布的作用。
import turtle as t //画图
import random as rd //随机数
import math as m //数学函数
setup() | 用于启动一个图形窗口,四个参数分别是窗口的宽高、窗口左上角点的坐标(坐标(0,0)是屏幕左上角) |
pensize() | 定义画笔的宽度(像素) |
bgcolor(),pencolor() | 设置背景颜色、画笔颜色 |
pu(),pd() | 或用down(),up(),启用或禁用画笔(若pd()则画笔落下,此时所有移动画笔的操作如forward()会在屏幕留下轨迹,而pu()则画笔抬起,此时所有动作只会移动画笔、调整落点,而不会留下轨迹) |
goto() | 将画笔'瞬移'到某一坐标,期间仍然会留下轨迹,需要配合pu(),pd()来使用 |
tracer() | 参数为布尔值,若为真代表显示绘画踪迹,假代表隐藏绘画踪迹(时间不变) |
color() | 可有两个参数,画笔颜色与填充颜色 |
fillcolor() | 设置画笔的填充颜色 |
begin_fill(),end_fill() | 一对填充标记,将再此期间画的封闭图形填上颜色 |
speed() | 设置画笔速度,一般和tracer(Ture)一起使用,即显示踪迹;speed参数范围为1-10,逐渐变快,若超过此范围则按光速0处理 |
forward(),backward() | 或用fd(),bk(),即让画笔向前、向后移动(参数可以为负值,即为反方向移动) |
left(),right() | 将画笔左/右转相应的角度 |
circle(),seth(),heading() | 当circle方法仅一个参数时是画圆,参数为其半径,两个参数时是画弧,第二个参数为弧度;seth将笔尖原地旋转一定的角度(无论笔尖朝向,以x轴正半轴方向为基准正左负右)(setheading的缩写),heading即为将当前画笔位置作为返回值返回 |
done() | 代表画图结束后程序停留,需要手动退出 |
turtle走直线111
t.shape("turtle")
while(True):
t.fd(200)
t.left(180)
1)使用shape()函数将画笔改为turtle库中的乌龟形状
2)在循环体中用fd和left函数配合使用来实现小乌龟反复不停的直线运动,left/right控制旋转角度(向左/向右)。
画80 111
省流:两个圆圈一个椭圆
1)用四个circle()画出四个半圆
2)通过一个循环(每次前进一丢丢,重复多次,并将循环变量递增或递减)一点点画出椭圆来。
import turtle as t
import math
#自顶而下画椭圆
def ellipse(angles):
loop_count = int(360/angles)
step = 1.0
for i in range(loop_count):
if (0<=i
主要是想用这个练习加深一下pu(),pd()的用法,做到随时动笔自如,下一个练习是用另一种更灵活的方法来移动画笔。
画气球_1
1)练习一下begin_fill和end_fill,以及与fillcolor,pu,pd等方法的组合使用
2)另外需注意若画笔右转90度后没有转回来,此时再次画圆时会出现移位现象(如下图),所以必须还原。
↑是没有及时还原画笔朝向的作品(还有点奇奇怪怪的美感怎么回事),这再次说明circle方法所画的圆是受当前笔尖朝向影响的。
import turtle as t
import math
RAS = 35
#画并填充圆
def drawCircle(x,y,color):
t.fillcolor(color)
t.pu()
t.goto(x,y)
t.pd()
t.begin_fill()
t.circle(RAS)
t.end_fill()
#画气球的绳子
t.right(90)
t.fd(90)
t.left(90)
if __name__ == "__main__":
t.tracer(True)
t.speed(8)
t.setup(600,450,0,0)
t.pensize(3)
drawCircle(-160,100,"yellow")
drawCircle(-125,100,"red")
drawCircle(-95,100,"blue")
drawCircle(-115,60,"pink")
drawCircle(-145,60,"purple")
t.done()#防止完成后闪退
1)画出由五个弧线段组成的基础山体
2)为了更方便地控制画笔,使用turtle.position()在命令行输出当前画笔坐标(下图中的两个标记点)
3)将山体填充上蓝色
画好的山头效果如下:
def drawFMT():
#改变初始位置
t.pu()
t.goto(-370,-295)#x,y
t.tracer(1)
t.pd()
t.speed(5)
#富士山
#山左侧的弧
t.fillcolor('RoyalBlue3')#深蓝色
t.begin_fill()
t.seth(23)#左边逆时针转动的弧度
t.circle(1150,10)
print('雪山左标记点:',t.position())
t.circle(800,10)
#山顶的弧
t.seth(-15)
t.circle(250,30)
#山右侧的弧
t.seth(-50)
t.circle(800,10)
#print('雪山右标记点:', t.position())
t.circle(800, 10)
t.end_fill()
1)画出雪的扇形部分区域
2)将鼠标移动到之前打印出的标记点位。
覆盖雪后效果如下:
def drawSnow():
t.tracer(1)
t.fillcolor('Snow2')
t.pu()
t.goto(-193.01,-200.89)#左标记点
t.pd()
t.begin_fill()
t.seth(33)
t.circle(750, 11)#左半弧
t.seth(-15)
t.circle(250, 29)#上弧
t.seth(-50)
t.circle(750, 11) #右弧
t.seth(-151)
t.circle(-330,62) #下弧
t.end_fill()
1)先对画笔设置好颜色(外红内黄)
2)进行若干次循环,每次循环都只向前画一条直线,并将朝向左转170度
3)最后代码以end_fill方法结尾,可以将画画中产生的闭环填充为黄色
完成效果如下:
def drawSun():
#移动画笔
t.pu()
t.goto(190,250)
t.tracer(1)
t.pd()
t.color('red', 'yellow')#(画笔颜色,填充颜色)
t.begin_fill()
count = 0
while (count<50):
t.speed(10)
#每次循环转170度并向前画
t.forward(80)
t.left(170)
count += 1
t.end_fill()
1)将画笔移动到指定位置
2)设计阴影效果函数(tan)、叶子效果函数以及树分支(n,angle_right,angle_left,next_br)、叶子方位(an,dis)随机值
3)根据思路设计递归函数,并增加装饰的粉红泡泡(else:ran)
4)增加飘落叶子,设置每次函数执行后返回起始点
树中每一支主干(从根到叶)即为一次递归操作。
def drawTree():
t.speed(10)#速度 1-10渐进,10 最快
t.tracer(120)
t.pu()#抬笔
t.goto(-200,-280)
t.left(90)#左转90度
tree(11,80)#(递归n层,树枝长度)
def tree(n,l):
t.pd()#下笔
#阴影效果
tan = m.cos(m.radians(t.heading()+45))/8+0.25
t.pencolor(tan,tan,tan)
t.pensize(n/3)
t.forward(l)
if n>0:#画树枝
angle_right = rd.random()*15+10 #右分支偏转角度
angle_left = rd.random()*15+10 #左分支偏转角度
next_br = l*(rd.random()*0.25+0.7) #下一个分支的长度
#右转一定角度,画右分支
t.right(angle_right)
tree(n-1,next_br)
#左转一定角度,画左分支
t.left(angle_right+angle_left)
tree(n-1,next_br)
#转回来
t.right(angle_left)
else:
#画叶子
t.right(90)
n=m.cos(m.radians(t.heading()-45))/4+0.5
ran=rd.random()
#添加了随机生成的粉红泡泡
if(ran>0.7):
t.begin_fill()
t.circle(3)
t.fillcolor('pink')
#把随机生成的叶子统一换成了粉色
t.pencolor("pink")
t.circle(3)
if(ran>0.7):
t.end_fill()
t.left(90)
#添加0.3倍的飘落叶子
if(rd.random()>0.7):
t.pu()
#飘落
tan = t.heading()
an = -40 +rd.random()*40
t.setheading(an)
dis = int(800*rd.random()*0.5 + 400*rd.random()*0.3 + 200*rd.random()*0.2)
t.forward(dis)
t.setheading(tan)
#画叶子
t.pd()
t.right(90)
n = m.cos(m.radians(t.heading()-45))/4+0.5
t.pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
t.circle(2)
t.left(90)
t.pu()
#返回
tan=t.heading()
t.setheading(an)
t.backward(dis)
t.setheading(tan)
t.pu()
t.backward(l)#退回
完整源代码:
import turtle as t #导入绘图库
import random as rd
import math as m
def drawSun():
#移动画笔
t.pu()
t.goto(190,250)
t.tracer(1)
t.pd()
t.color('red', 'yellow')#(画笔颜色,填充颜色)
t.begin_fill()
count = 0
while (count<50):
t.speed(10)
#每次循环转170度并向前画
t.forward(80)
t.left(170)
count += 1
t.end_fill()
def drawSnow():
t.tracer(1)
t.fillcolor('Snow2')
t.pu()
t.goto(-193.01,-200.89)#左标记点
t.pd()
t.begin_fill()
t.seth(33)
t.circle(750, 11)#左半弧
t.seth(-15)
t.circle(250, 29)#上弧
t.seth(-50)
t.circle(750, 11) #右弧
t.seth(-151)
t.circle(-330,62) #下弧
t.end_fill()
def drawFMT():
#改变初始位置
t.pu()
t.goto(-370,-295)#x,y
t.tracer(1)
t.pd()
t.speed(9)
#富士山
#山左侧的弧
t.fillcolor('RoyalBlue3')#深蓝色
t.begin_fill()
t.seth(23)#左边逆时针转动的弧度
t.circle(1150,10)
print('雪山左标记点:',t.position())
t.circle(800,10)
#山顶的弧
t.seth(-15)
t.circle(250,30)
#山右侧的弧
t.seth(-50)
t.circle(800,10)
print('雪山右标记点:', t.position())
t.circle(800, 10)
t.end_fill()
def drawTree():
t.speed(10)#速度 1-10渐进,10 最快
t.tracer(120)
t.pu()#抬笔
t.goto(-200,-280)
t.left(90)#左转90度
tree(11,80)#(递归n层,树枝长度)
def tree(n,l):
t.pd()#下笔
#阴影效果
tan = m.cos(m.radians(t.heading()+45))/8+0.25
t.pencolor(tan,tan,tan)
t.pensize(n/3)
t.forward(l)
if n>0:#画树枝
angle_right = rd.random()*15+10 #右分支偏转角度
angle_left = rd.random()*15+10 #左分支偏转角度
next_br = l*(rd.random()*0.25+0.7) #下一个分支的长度
#右转一定角度,画右分支
t.right(angle_right)
tree(n-1,next_br)
#左转一定角度,画左分支
t.left(angle_right+angle_left)
tree(n-1,next_br)
#转回来
t.right(angle_left)
else:
#画叶子
t.right(90)
n=m.cos(m.radians(t.heading()-45))/4+0.5
ran=rd.random()
#添加了随机生成的粉红泡泡
if(ran>0.7):
t.begin_fill()
t.circle(3)
t.fillcolor('pink')
#把随机生成的叶子统一换成了粉色
t.pencolor("pink")
t.circle(3)
if(ran>0.7):
t.end_fill()
t.left(90)
#添加0.3倍的飘落叶子
if(rd.random()>0.7):
t.pu()
#飘落
tan = t.heading()
an = -40 +rd.random()*40
t.setheading(an)
dis = int(800*rd.random()*0.5 + 400*rd.random()*0.3 + 200*rd.random()*0.2)
t.forward(dis)
t.setheading(tan)
#画叶子
t.pd()
t.right(90)
n = m.cos(m.radians(t.heading()-45))/4+0.5
t.pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
t.circle(2)
t.left(90)
t.pu()
#返回
tan=t.heading()
t.setheading(an)
t.backward(dis)
t.setheading(tan)
t.pu()
t.backward(l)#退回
if(__name__ == '__main__'):
t.setup(800,600,250,-200)#建立画布,找准坐标
#t.bgcolor('Thistle') # 背景色
t.bgcolor(0.956,0.9255,0.9882)#设置背景色(把灰色换成淡紫色)
t.ht() #隐藏小乌龟,hideturtle()的缩写
drawFMT()
drawSnow()
drawSun()
drawTree()
t.done()#暂停程序