小白自学笔记之Python入门-第四章 常用模块-turtle
4.1 turtle
turtle库是Python语言中一个内置的绘图的函数库,在一个横轴为x、纵轴为y的坐标系原点,(0,0)开始,它根据一组函数指令的控制,在这个平面坐标系中绘制图形。使用turtle库前,要用import导入该库,下面直接介绍绘图步骤。
1导入turtle库
使用turtle进行绘图必须导入turtle库,具体代码如下
import turtle
2设置画布大小(可以不设置)
画布就是turtle给我们提供的绘图区域,坐标原点位于中心位置,向右x增加,向上y增加。可以使用turtle的screensize函数设置画布的大小和初始位置。turtle.screensize (canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(以像素为单位),高和背景颜色。如:turtle.screensize(80,60, "green")。
3使用画笔绘图
画笔是图形绘制的工具,画笔的属性,颜色、画线的宽度可以使用设置。
(1) turtle.pensize():设置画笔的宽度(以像素为单位)
(2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red"。
(3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。使用turtle画图时,能够看到绘制过程,画笔速度可以影响绘制速度。
绘图有三种命令:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。
命令 说明
turtle.forward(distance) 向当前画笔方向移动distance像素长度
turtle.backward(distance) 向当前画笔相反方向移动distance像素长度
turtle.right(degree) 顺时针移动degree°
turtle.left(degree) 逆时针移动degree°
turtle.pendown() 移动时绘制图形,缺省时也为绘制
turtle.goto(x,y) 将画笔移动到坐标为x,y的位置
turtle.penup() 提起笔移动,不绘制图形,用于另起一个地方绘制
turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
setx( ) 将当前x轴移动到指定位置
sety( ) 将当前y轴移动到指定位置
setheading(angle) 设置当前朝向为angle角度
home() 设置当前画笔位置为原点,朝向东。
dot(r) 绘制一个指定直径和颜色的圆点
表 画笔运动命令
turtle.circle()语法为 turtle.circle(radius, extent=None, steps=None)
radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;
extent(弧度) (optional);弧形角度。当无该参数或参数为None时,绘制整个圆形。当extent值为正数时,顺小海龟当前方向绘制。当extent值为负数时,小海龟当前方向的逆方向绘制。
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。
命令 说明
turtle.fillcolor(colorstring) 绘制图形的填充颜色
turtle.color(color1, color2) 同时设置pencolor=color1, fillcolor=color2
turtle.filling() 返回当前是否在填充状态
turtle.begin_fill() 准备开始填充图形
turtle.end_fill() 填充完成
turtle.hideturtle() 隐藏画笔的turtle形状
turtle.showturtle() 显示画笔的turtle形状
表 画笔控制命令
命令 说明
turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变
turtle.reset() 清空窗口,重置turtle状态为起始状态
turtle.undo() 撤销上一个turtle动作
turtle.isvisible( ) 返回当前turtle是否可见
stamp() 复制当前图形
turtle.write(s [,font=("font-name", font_size, "font_type")])
写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项
turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变
表 全局控制命令
例子们乘风破浪的来了!此部分参考网络资料。有的图形可以自己参考改造,我等着你们的原创,漂亮的图形会替换下面的例子!有的图形复制一下代码看看运行结果得了,反正现在也不明白!
(1)五角星

import turtle
turtle.screensize(200,200, "green")
turtle.pencolor("blue")
turtle.pensize(2)
turtle.speed(2)
turtle.penup()
turtle.goto(-100,50)
turtle.pendown()
turtle.color("red")
turtle.begin_fill()
for i in range(5):
turtle.forward(200)
turtle.right(144)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
(2)心形

import turtle
turtle.color('red','pink')
turtle.begin_fill()
turtle.left(135)
turtle.fd(100)
turtle.right(180)
turtle.circle(50,-180)
turtle.left(90)
turtle.circle(50,-180)
turtle.right(180)
turtle.fd(100)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
(3)太阳花

import turtle
turtle.color("red", "yellow")
turtle.begin_fill()
for _ in range(50):
turtle.forward(200)
turtle.left(170)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
(4)peppa pig

import turtle
turtle.screensize(200,200, "green")
turtle.pensize(4)
turtle.hideturtle()
turtle.colormode(255)
turtle.color((255, 155, 192), "pink")
turtle.setup(840, 500)
turtle.speed(10)
# 鼻子
turtle.pu()
turtle.goto(-100, 100)
turtle.pd()
turtle.seth(-30)
turtle.begin_fill()
a = 0.4
for i in range(120):
if 0 <= i < 30 or 60 <= i < 90:
a = a + 0.08
turtle.lt(3) # 向左转3度
turtle.fd(a) # 向前走a的步长
else:
a = a - 0.08
turtle.lt(3)
turtle.fd(a)
turtle.end_fill()
turtle.pu()
turtle.seth(90)
turtle.fd(25)
turtle.seth(0)
turtle.fd(10)
turtle.pd()
turtle.pencolor(255, 155, 192)
turtle.seth(10)
turtle.begin_fill()
turtle.circle(5)
turtle.color(160, 82, 45)
turtle.end_fill()
turtle.pu()
turtle.seth(0)
turtle.fd(20)
turtle.pd()
turtle.pencolor(255, 155, 192)
turtle.seth(10)
turtle.begin_fill()
turtle.circle(5)
turtle.color(160, 82, 45)
turtle.end_fill()
# 头
turtle.color((255, 155, 192), "pink")
turtle.pu()
turtle.seth(90)
turtle.fd(41)
turtle.seth(0)
turtle.fd(0)
turtle.pd()
turtle.begin_fill()
turtle.seth(180)
turtle.circle(300, -30)
turtle.circle(100, -60)
turtle.circle(80, -100)
turtle.circle(150, -20)
turtle.circle(60, -95)
turtle.seth(161)
turtle.circle(-300, 15)
turtle.pu()
turtle.goto(-100, 100)
turtle.pd()
turtle.seth(-30)
a = 0.4
for i in range(60):
if 0 <= i < 30 or 60 <= i < 90:
a = a + 0.08
turtle.lt(3) # 向左转3度
turtle.fd(a) # 向前走a的步长
else:
a = a - 0.08
turtle.lt(3)
turtle.fd(a)
turtle.end_fill()
# 耳朵
turtle.color((255, 155, 192), "pink")
turtle.pu()
turtle.seth(90)
turtle.fd(-7)
turtle.seth(0)
turtle.fd(70)
turtle.pd()
turtle.begin_fill()
turtle.seth(100)
turtle.circle(-50, 50)
turtle.circle(-10, 120)
turtle.circle(-50, 54)
turtle.end_fill()
turtle.pu()
turtle.seth(90)
turtle.fd(-12)
turtle.seth(0)
turtle.fd(30)
turtle.pd()
turtle.begin_fill()
turtle.seth(100)
turtle.circle(-50, 50)
turtle.circle(-10, 120)
turtle.circle(-50, 56)
turtle.end_fill()
# 眼睛
turtle.color((255, 155, 192), "white")
turtle.pu()
turtle.seth(90)
turtle.fd(-20)
turtle.seth(0)
turtle.fd(-95)
turtle.pd()
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()
turtle.color("black")
turtle.pu()
turtle.seth(90)
turtle.fd(12)
turtle.seth(0)
turtle.fd(-3)
turtle.pd()
turtle.begin_fill()
turtle.circle(3)
turtle.end_fill()
turtle.color((255, 155, 192), "white")
turtle.pu()
turtle.seth(90)
turtle.fd(-25)
turtle.seth(0)
turtle.fd(40)
turtle.pd()
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()
turtle.color("black")
turtle.pu()
turtle.seth(90)
turtle.fd(12)
turtle.seth(0)
turtle.fd(-3)
turtle.pd()
turtle.begin_fill()
turtle.circle(3)
turtle.end_fill()
# 腮
turtle.color((255, 155, 192))
turtle.pu()
turtle.seth(90)
turtle.fd(-95)
turtle.seth(0)
turtle.fd(65)
turtle.pd()
turtle.begin_fill()
turtle.circle(30)
turtle.end_fill()
# 嘴turtle.color(239, 69, 19)
turtle.pu()
turtle.seth(90)
turtle.fd(15)
turtle.seth(0)
turtle.fd(-100)
turtle.pd()
turtle.seth(-80)
turtle.circle(30, 40)
turtle.circle(40, 80)
# 身体
turtle.color("red", (255, 99, 71))
turtle.pu()
turtle.seth(90)
turtle.fd(-20)
turtle.seth(0)
turtle.fd(-78)
turtle.pd()
turtle.begin_fill()
turtle.seth(-130)
turtle.circle(100, 10)
turtle.circle(300, 30)
turtle.seth(0)
turtle.fd(230)
turtle.seth(90)
turtle.circle(300, 30)
turtle.circle(100, 3)
turtle.color((255, 155, 192), (255, 100, 100))
turtle.seth(-135)
turtle.circle(-80, 63)
turtle.circle(-150, 24)
turtle.end_fill()
# 手
turtle.color((255, 125, 192))
turtle.pu()
turtle.seth(90)
turtle.fd(-40)
turtle.seth(0)
turtle.fd(-27)
turtle.pd()
turtle.seth(-160)
turtle.circle(300, 15)
turtle.pu()
turtle.seth(90)
turtle.fd(15)
turtle.seth(0)
turtle.fd(0)
turtle.pd()
turtle.seth(-10)
turtle.circle(-20, 90)
turtle.pu()
turtle.seth(90)
turtle.fd(30)
turtle.seth(0)
turtle.fd(237)
turtle.pd()
turtle.seth(-20)
turtle.circle(-300, 15)
turtle.pu()
turtle.seth(90)
turtle.fd(20)
turtle.seth(0)
turtle.fd(0)
turtle.pd()
turtle.seth(-170)
turtle.circle(20, 90)
# 脚
turtle.pensize(10)
turtle.color((112, 128, 128))
turtle.pu()
turtle.seth(90)
turtle.fd(-75)
turtle.seth(0)
turtle.fd(-180)
turtle.pd()
turtle.seth(-90)
turtle.fd(40)
turtle.seth(-180)
turtle.color("black")
turtle.pensize(15)
turtle.fd(20)
turtle.pensize(10)
turtle.color((240, 128, 128))
turtle.pu()
turtle.seth(90)
turtle.fd(40)
turtle.seth(0)
turtle.fd(90)
turtle.pd()
turtle.seth(-90)
turtle.fd(40)
turtle.seth(-180)
turtle.color("black")
turtle.pensize(15)
turtle.fd(20)
# 尾巴
turtle.pensize(4)
turtle.color((255, 155, 192))
turtle.pu()
turtle.seth(90)
turtle.fd(70)
turtle.seth(0)
turtle.fd(95)
turtle.pd()
turtle.seth(0)
turtle.circle(70, 20)
turtle.circle(10, 330)
turtle.circle(70, 30)
turtle.done()
(5)樱花树:这个就属于复制一下代码看看运行结果得了,反正现在也不明白!

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()
# 掉落的花瓣
def Petal(m, t):
for i in range(m):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
t.color('lightcoral') # 淡珊瑚色
t.circle(1)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 绘图区域
t = T.Turtle()
# 画布大小
w = T.Screen()
t.hideturtle() # 隐藏画笔
t.getscreen().tracer(5, 0)
w.screensize(bg='wheat') # wheat小麦
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')
# 画樱花的躯干
Tree(60, t)
# 掉落的花瓣
Petal(200, t)
w.exitonclick()
(6)闹钟:这个是目前难度最大的,复制一下代码看看运行结果得了,反正现在也不明白!

import turtle
from datetime import *
# 抬起画笔,向前运动一段距离放下
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
def mkHand(name, length):
# 注册Turtle形状,建立表针Turtle
turtle.reset()
Skip(-length * 0.1)
# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.begin_poly()
turtle.forward(length * 1.1)
# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.end_poly()
# 返回最后记录的多边形。
handForm = turtle.get_poly()
turtle.register_shape(name, handForm)
def Init():
global secHand, minHand, hurHand, printer
# 重置Turtle指向北
turtle.mode("logo")
# 建立三个表针Turtle并初始化
mkHand("secHand", 135)
mkHand("minHand", 125)
mkHand("hurHand", 90)
secHand = turtle.Turtle()
secHand.shape("secHand")
minHand = turtle.Turtle()
minHand.shape("minHand")
hurHand = turtle.Turtle()
hurHand.shape("hurHand")
for hand in secHand, minHand, hurHand:
hand.shapesize(1, 1, 3)
hand.speed(0)
# 建立输出文字Turtle
printer = turtle.Turtle()
# 隐藏画笔的turtle形状
printer.hideturtle()
printer.penup()
def SetupClock(radius):
# 建立表的外框
turtle.reset()
turtle.pensize(7)
for i in range(60):
Skip(radius)
if i % 5 == 0:
turtle.forward(20)
Skip(-radius - 20)
Skip(radius + 20)
if i == 0:
turtle.write(int(12),, font=("Courier", 14, "bold"))
elif i == 30:
Skip(25)
turtle.write(int(i / 5),, font=("Courier", 14, "bold"))
Skip(-25)
elif (i == 25 or i == 35):
Skip(20)
turtle.write(int(i / 5),, font=("Courier", 14, "bold"))
Skip(-20)
else:
turtle.write(int(i / 5),, font=("Courier", 14, "bold"))
Skip(-radius - 20)
else:
turtle.dot(5)
Skip(-radius)
turtle.right(6)
def Week(t):
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]
def Date(t):
y = t.year
m = t.month
d = t.day
return "%s %d%d" % (y, m, d)
def Tick():
# 绘制表针的动态显示
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
secHand.setheading(6 * second)
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
turtle.tracer(False)
printer.forward(65)
printer.write(Week(t),,
font=("Courier", 14, "bold"))
printer.back(130)
printer.write(Date(t),,
font=("Courier", 14, "bold"))
printer.home()
turtle.tracer(True)
# 100ms后继续调用tick
turtle.ontimer(Tick, 100)
def main():
# 关闭动画,并为更新图纸设置延迟。
turtle.tracer(False)
Init()
SetupClock(160)
turtle.tracer(True)
Tick()
turtle.mainloop()
if __name__ == "__main__":
main()