turtle(海龟)知识点
知识点大纲
目录
Python的一个简单介绍
Python的turtle库是一个用于绘制图形的库,它来自 Wally Feurzeig, Seymour Papert 于 1967 年在麻省理工学院MIT人工智能实验室开发的 Logo 编程语言。由于turtle绘图十分的直观而且十分受欢迎,所以turtle也逐渐的成为了Python的标准库之一。它很容易学习并且使用简单。
安装turtle库
使用turtle库,第一步,安装turtle库,使用pip命令安装turtle
pip install turtle
一、turtle绘图的基础知识
import turtle
1、画布
对小海龟来说,有“前进”,“后退”,“旋转”等行为,相对于坐标系也是通过“前进方向”、“后退方向”、“左侧方向”、“右侧方向”来完成,并且它可以变换颜色,改变大小等。画布就是turtle为我们用于绘图区域提供的窗口, 我们可以根据坐标参数设置它的大小和初始位置。
1.1 绘图坐标系
a. setup()方法
turtle.setup(width,height,startx,starty) # turtle.setup(width=_CFG["width"], height=_CFG["height"], startx=_CFG["leftright"], starty=_CFG["topbottom"])
作用:设置主窗口的大小和位置。默认参数值保存在配置字典中,可通过
turtle.cfg
文件进行修改。
- width: 窗口宽度,如果值是整数,表示像素值;如果值是小数,表示窗口宽度与屏幕的比例,默认为屏幕的 50%。
- height : 窗口高度,如果值是整数,表示像素值;如果值是小数,表示窗口高度与屏幕的比例,默认为屏幕的 75%。
- startx: 如为正值,表示初始位置距离屏幕左边缘多少像素,负值表示距离右边缘,如果值是None,窗口位于屏幕水平中央。
- starty: 如为正值,表示初始位置距离屏幕上边缘多少像素,负值表示距离下边缘,如果值是None,窗口位于屏幕垂直中央。
实例:
import turtle, time turtle.screensize(800, 600, "pink") turtle.screensize() #返回默认大小(400, 300) time.sleep(3)
注意:
- setup()也是可选的,只是需要定义窗口的大小及位置是才使用。
b. screensize()方法
screensize包括3个参数,定义了画板的大小和背景色。
turtle.screensize(canvwidth, canvheight, bg) # turtle.screensize(canvwidth=None, canvheight=None, bg=None)
canvwidth -- 正整型数,以像素表示画布的新宽度值
canvheight -- 正整型数,以像素表示画面的新高度值
bg -- 颜色字符串或颜色元组,新的背景颜色
实例:
import turtle, time turtle.screensize(800, 600, "pink") turtle.screensize() #返回默认大小(400, 300) time.sleep(3)
注意:
- 如未指定任何参数,则返回当前的 (canvaswidth, canvasheight)。否则改变作为海龟绘图场所的画布大小。不改变绘图窗口。要观察画布的隐藏区域,可以使用滚动条。通过此方法可以令之前绘制于画布之外的图形变为可见。
- 想要改变窗口的大小,改变screensize不行,需要改变setup。
2、画笔
turtle中的画笔可以通过函数来控制
turtle.penup() # 抬起画笔,之后移动画笔不绘制形状。 turtle.pendown() # 落下画笔,之后移动画笔将绘制形状。 turtle.pensize() # 用来设置画笔尺寸;turtle.width()设置画笔宽度,当无参数输入时返回当前画笔宽度。 turtle.pencolor()# 没有参数传入返回当前画笔颜色。turtle.pencolor((r,g,b))设置当前画笔颜色。 turtle.speed() # 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
2.1 RGB色彩体系
在计算机RGB色彩体系中,很多颜色都有固定的英文名字,这些英文名字可以作为colorstring输入到turtle.pencolor()函数中,也可以采用(r,g,b)形式直接输入颜色值。下面介绍几种典型的RGB颜色
常用颜色:
英文名称 | RGB整数值 | RGB小数值 | 中文名称 |
---|---|---|---|
white | 255,255,255 | 1,1,1 | 白色 |
yellow | 255,255,0 | 1,1,0 | 黄色 |
magenta | 255,0,255 | 1,0,1 | 洋红 |
cyan | 0,255,255 | 0,1,1 | 青色 |
blue | 0,0,255 | 0,0,1 | 蓝色 |
black | 0,0,0 | 0,0,0 | 黑色 |
purple | 160,32,240 | 0.63,0.13,0.94 | 紫色 |
# 颜色字符串
turtle.pencolor('purple') # 小写
# RGB小数值
turtle.pencolor(0.63,0.13,0.94) #三个小数值
# RGB数值元组
turtle.pencolor((0.63,0.13,0.94)) # 一个三元素元组
RGB (RedAs Integer ,GreenAs Integer ,BlueAs Integer )
部分 |
描述 |
red |
必要参数;Integer类型。数值范围从 0 到 255,表示颜色的红色成份。 |
green |
必要参数;Integer类型。数值范围从 0 到 255,表示颜色的绿色成份。 |
blue |
必要参数;Integer类型。数值范围从 0 到 255,表示颜色的蓝色成份。 |
注意:
- 使用
turtle.colormode(mode)
来调整海龟的颜色,默认采用RGB小数值,可以切换为整数值- 如果其中有一个参数的值超过 255 ,不会显示任何错误,但这个参数会被当做 255。
3、绘图命令方法
turtle通过一组函数控制画笔的行进动作,进而绘制形状,这些函数命令分别是:画笔运动方法、画笔控制方法和全局控制方法。
3.1 画笔运动方法
命令 | 说明 |
---|---|
turtle.forward(distance) | 海龟前进 distance 指定的距离,方向为海龟的朝向。 |
turtle.backward(distance) | 海龟后退 distance 指定的距离,方向与海龟的朝向相反。不改变海龟的朝向。 |
turtle.right(angle) | 海龟右转 angle 个单位。(单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。) |
turtle.left(degree) | 海龟左转 angle 个单位。(单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。) |
turtle.pendown() | 移动时绘制图形,缺省时也为绘制 |
turtle.goto(x,y) | 将画笔移动到坐标为x,y的位置 |
turtle.penup() | 移动时不绘制图形,提起笔,用于另起一个地方绘制时用 |
turtle.speed(speed) | 设置海龟移动的速度为 0..10 表示的整型数值。如未指定参数则返回当前速度。
速度值从 1 到 10,画线和海龟转向的动画效果逐级加快。 注意: speed = 0 表示 没有 动画效果。forward/back 将使海龟向前/向后跳跃,同样的 left/right 将使海龟立即改变朝向。 |
turtle.circle(radius, extent=None, steps=None) | 绘制一个 radius 指定半径的圆。圆心在海龟左边 radius 个单位;extent 为一个夹角,用来决定绘制圆的一部分。如未指定 extent*则绘制整个圆。如果 *extent 不是完整圆周,则以当前画笔位置为一个端点绘制圆弧。如果 radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。最终海龟的朝向会依据 extent 的值而改变。 |
3.2 画笔控制方法
命令 | 说明 |
---|---|
turtle.pensize(width=None) | 绘制图形时的宽度 |
turtle.pen(pen=None, pendict) | 返回或设置画笔的属性,以一个包含以下键值对的 "画笔字典" 表示:
|
turtle.fillcolor(*args) | 返回或设置填充颜色
返回以颜色描述字符串或元组 (见示例) 表示的当前填充颜色。可用作其他 color/pencolor/fillcolor 调用的输入。
设置填充颜色为 colorstring 指定的 Tk 颜色描述字符串,例如
设置填充颜色为以 r, g, b 元组表示的 RGB 颜色。r, g, b 的取值范围应为 0..colormode,colormode 的值为 1.0 或 255 。
设置填充颜色为 r, g, b 表示的 RGB 颜色。r, g, b 的取值范围应为 0..colormode。 |
turtle.color(*args) | 返回或设置画笔颜色和填充颜色,填充为 True ,否则为 False。 |
turtle.filling() | 返回当前是否在填充状态 |
turtle.begin_fill() | 在绘制要填充的形状之前调用。 |
turtle.end_fill() | 填充上次调用 begin_fill() 之后绘制的形状。 |
turtle.hideturtle() | 使海龟不可见,隐藏海龟可显著加快绘制速度。 |
turtle.showturtle() | 使海龟可见。 |
3.3 全局控制方法
命令 | 说明 |
---|---|
turtle.clear() | 从中删除所有海龟的全部绘图。将已清空的 TurtleScreen 重置为初始状态: 白色背景,无背景片,无事件绑定并启用追踪。 |
turtle.reset() | 清空窗口,重置turtle状态为起始状态 |
turtle.undo() | 撤消 (或连续撤消) 最近的一个 (或多个) 海龟动作。可撤消的次数由撤消缓冲区的大小决定。 |
turtle.isvisible() | 如果海龟显示返回 True ,如果海龟隐藏返回 False 。 |
turtle.stamp() | 在海龟当前位置印制一个海龟形状。返回该印章的 stamp_id,印章可以通过调用 clearstamp(stamp_id) 来删除。 |
turtle.write(s[,font=("font-name",font_size,"font_type")]) | 写文本,s为文本内容,font是字体的参数,里面分别为字体名称,大小和类型;font为可选项, font的参数也是可选项 |
3.4 其他的一些特殊方法
命令 |
说明 |
|||||||||
turtle.mainloop()或turtle.done() |
开始事件循环 - 调用 Tkinter 的 mainloop 函数。必须作为一个海龟绘图程序的结束语句。 | |||||||||
turtle.mode(mode=None) |
设置乌龟模式(“standard”,“logo”或“world”)并执行重置。如果没有给出模式,则返回当前模式。
|
|||||||||
turtle.delay(delay=None) |
设置或返回以毫秒为单位的绘图延迟。 |
|||||||||
turtle.begin_poly() |
开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 |
|||||||||
turtle.end_poly() |
停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 |
|||||||||
turtle.get_poly() |
返回最新记录的多边形。 |
4、turtle库快速参考
到这里已经可以自己动手写出一个简单的图形了吗?
5、一些实例
5.1 实现一个樱花树
import turtle
import random
from turtle import *
from time import sleep
# 画樱花的躯干(60,t)
turtle.hideturtle()
def tree(branchLen, t):
sleep(0.0005)
if branchLen > 3:
if 8 <= branchLen <= 12:
if random.randint(0, 2) == 0:
t.color('snow') # 白
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branchLen / 3)
elif branchLen < 8:
if random.randint(0, 1) == 0:
t.color('snow')
else:
t.color('lightcoral') # 淡珊瑚色
t.pensize(branchLen / 2)
else:
t.color('sienna') # 赭(zhě)色
t.pensize(branchLen / 10) # 6
t.forward(branchLen)
a = 1.5 * random.random()
t.right(20 * a)
b = 1.5 * random.random()
tree(branchLen - 10 * b, t)
t.left(40 * a)
tree(branchLen - 10 * b, t)
t.right(20 * a)
t.up()
t.backward(branchLen)
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)
def main():
# 绘图区域
t = turtle.Turtle()
# 画布大小
w = turtle.Screen()
t.hideturtle() # 隐藏画笔
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()
main()
5.2 画一朵玫瑰花
#RoseDraw.py
import turtle as t
# 定义一个曲线绘制函数
def DegreeCurve(n, r, d=1):
for i in range(n):
t.left(d)
t.circle(r, abs(d))
# 初始位置设定
s = 0.2 # size
t.setup(450*5*s, 750*5*s)
t.pencolor("black")
t.fillcolor("red")
t.speed(100)
t.penup()
t.goto(0, 900*s)
t.pendown()
# 绘制花朵形状
t.begin_fill()
t.circle(200*s,30)
DegreeCurve(60, 50*s)
t.circle(200*s,30)
DegreeCurve(4, 100*s)
t.circle(200*s,50)
DegreeCurve(50, 50*s)
t.circle(350*s,65)
DegreeCurve(40, 70*s)
t.circle(150*s,50)
DegreeCurve(20, 50*s, -1)
t.circle(400*s,60)
DegreeCurve(18, 50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.right(123)
t.circle(220*s,57)
t.end_fill()
# 绘制花枝形状
t.left(120)
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70, 225*s, -1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20, 2500*s)
DegreeCurve(220, 250*s, -1)
# 绘制一个绿色叶子
t.fillcolor('green')
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40)
# 绘制另一个绿色叶子
t.penup()
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done()
5.3 画一个心
import turtle
import time
# 画爱心的顶部
def LittleHeart():
for i in range(200):
turtle.right(1)
turtle.forward(2)
# 输入表白的语句,默认I Love you
love = input('请输入表白语句,默认为输入为"I Love you": ')
# 输入署名或者赠谁,没有不执行
me = input('请输入您心上人的姓名或者昵称: ')
if love == '':
love = 'I Love you'
# 窗口大小
turtle.setup(width=800, height=500)
# 颜色
turtle.color('red', 'pink')
# 笔粗细
turtle.pensize(5)
# 速度
turtle.speed(10)
# 提笔
turtle.up()
# 隐藏笔
turtle.hideturtle()
# 去到的坐标,窗口中心为0,0
turtle.goto(0, -180)
turtle.showturtle()
# 画上线
turtle.down()
turtle.speed(1)
turtle.begin_fill()
turtle.left(140)
turtle.forward(224)
# 调用画爱心左边的顶部
LittleHeart()
# 调用画爱右边的顶部
turtle.left(120)
LittleHeart()
# 画下线
turtle.forward(224)
turtle.end_fill()
turtle.pensize(5)
turtle.up()
turtle.hideturtle()
# 在心中写字 一次
turtle.goto(0, 0)
turtle.showturtle()
turtle.color('#CD5C5C', 'red')
# 在心中写字 font可以设置字体自己电脑有的都可以设 align开始写字的位置
turtle.write(love, font=('gungsuh', 30,), align="center")
turtle.up()
turtle.hideturtle()
time.sleep(2)
# 写署名
if me != '':
turtle.color('black', 'pink')
time.sleep(2)
turtle.goto(180, -180)
turtle.showturtle()
turtle.write(me, font=(20,), align="center", move=True)
# 点击窗口关闭
window = turtle.Screen()
window.exitonclick()