Turtle是python内置的图形化模块,可以用来绘制线条、圆、文本等图形。
画布就是turtle用于绘图区域, 我们可以设置它的大小和初始位置
1.设置画布大小:
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
turtle.screensize(800, 600, "green")
turtle.screensize() #返回默认大小(400, 300)
参数:画布的宽(canvwidth,单位像素), 高(canvheight), 背景颜色(bg)
turtle.setup(width=0.5, height=0.75, startx=None, starty=None)
turtle.setup(width=0.6, height=0.6)
turtle.setup(width=800, height=800, startx=100, starty=100)
参数:
width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例
(startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心
2.画笔:
在画布上,默认有一个坐标原点为画布中心的坐标轴, 坐标原点上有一只面朝x轴正方向小乌龟. 小乌龟属性:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中, 就是使用位置方向描述小乌龟(画笔)的状态
画笔的属性(颜色、画线的宽度):
turtle.pensize() #设置画笔的宽度;
turtle.pencolor() #没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组,
turtle.speed(speed) #设置画笔移动速度,画笔绘制的速度范围[0,10]整数, 数字越大越快
3.绘图命令:
(1)画笔运动命令:
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.speed(speed) :画笔绘制的速度范围[0,10]整数
turtle.circle():画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆
setx( ):将当前x轴移动到指定位置
sety( ):将当前y轴移动到指定位置
setheading(angle):设置当前朝向为angle角度
home():设置当前画笔位置为原点,朝向东。
dot®:绘制一个指定直径和颜色的圆点
(2)画笔控制命令:
turtle.pensize(width) :绘制图形时的宽度
turtle.pencolor():画笔颜色
turtle.fillcolor(colorstring) :绘制图形的填充颜色
turtle.color(color1, color2): 同时设置pencolor=color1, fillcolor=color2
turtle.filling() :返回当前是否在填充状态
turtle.begin_fill():准备开始填充图形
turtle.end_fill() :填充完成;
turtle.hideturtle() :隐藏箭头显示;
turtle.showturtle() :与hideturtle()函数对应
(3) 全局控制命令
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的参数也是可选项
(4)其他命令:
turtle.mainloop()或turtle.done()启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。
turtle.delay(delay=None)设置或返回以毫秒为单位的绘图延迟。
turtle.begin_poly()开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.end_poly()停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.get_poly()返回最后记录的多边形。
turtle.mode(mode=None)设置乌龟模式(“standard”,“logo”或“world”)并执行重置。如果没有给出模式,则返回当前模式。
4.命令详解:
<1>.画笔运动命令:
(1)turtle.forward(distance):画笔向绘制方向的当前方向移动distance(integer or float)的pixels距离,
turtle.forward(150)
(2)turtle.backward(distance) | turtle.bk(distance):画笔向绘制方向的相反方向移动distance(integer or float)的pixels距离
turtle.backward(200)
(3)turtle.right(angle) :绘制方向向右旋转angle度
turtle.right(45)
(4)turtle.left(angle):绘制方向向左旋转angle度
turtle.left(45)
(5)turtle.setx(x):y纵向坐标不变,更改x横向坐标,x(integer or float):
turtle.setx(10)
(6)turtle.sety(y):x横向坐标不变,更改y纵向坐标,y(integer or float):
turtle.sety(10)
(7)turtle.setheading(to_angle)
将方向设置成to_angle.to_angle(integer or float)to_angle的值在不同模式下含义如下
"standard"模式逆时针 "logo"模式顺时针
0 - east 0 - north
90 - north 90 - east
180 - west 180 - south
270 - south 270 - west
turtle.setheading(90)
(8)turtle.home() :将位置和方向恢复到初始状态,位置初始坐标为(0,0),方向初始为("standard"模式为right向右即东,"logo"模式是up向上即北)
turtle.home()
(9)turtle.circle(radius, extent=None, steps=None):按给定的半径画圆,当前位置为圆的初始端点
radius(a number,圆半径,为正数则逆时针画,为负数则顺时针画,方向随着轨迹的变化而变化)
extent(a number or None,弧度)
steps(an integer or None,做半径为radius的圆的内切正多边形,多边形边数为steps)
circle(50) # 整圆;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圆
turtle.home()# 当前位置(0,0)开始逆时针画半径为30的圆
turtle.circle(30)# 逆时针画半径为50的半圆
turtle.circle(50, 180)# 方向值为180,“standard”模式时方向向左,“logo”模式方向向下
print(turtle.heading())
turtle.circle(-50, 180)
print(turtle.heading())# 逆时针方向半径为40画五边形(5步画接近整圆的图形)
turtle.circle(40, None, 5)
(10)turtle.dot(size=None, color):按给定直径size画圆点(None[未提供时取pensize+4 和 2pensize中的最大值] 或 >= 1的整数),color圆点颜色
turtle.home()# 当前画笔大小为1
print(turtle.pensize())# 未提供取最大直径值为pensize+4 = 5
turtle.dot()
turtle.fd(50)# 以直径为5画蓝色圆点
turtle.dot(5, "blue")
turtle.fd(50)# 以直径为20画红色圆点
turtle.dot(20, "red")
turtle.fd(50)
print(turtle.position())
print(turtle.heading())
(11)turtle.speed(speed=None)
speed为0-10的整数(1-10越来越快,0表示最快,参数为小数会被自动置为整数)
如果>10或小于0.5则被置为0;为>=0.5的小数时被置为四舍五入的值。
speed未设置则返回当前速度
turtle.speed(0)
# <0.5速度会被置为0,表示速度最快
turtle.speed(0.4)
# >10速度会被置为0,表示速度最快
turtle.speed(20)
# 速度字符串fastest,表示速度最快
turtle.speed("fastest")
# 速度最慢
turtle.speed("slowest")
# 速度为9
turtle.speed(9)
(12)turtle.goto(20, 20):移动后,位置为(20,20),两个向量分别是(20,20)点到(0, 0)点的向量和(20, 20)点到箭头当前方向的向量("standard"模式默认向右,逆时针算角度,"logo"模式默认向上,顺时针算角度)
angle = turtle.towards(0, 0)
print("两向量角度:", angle)
(13)turtle.penup() :画笔抬起,此时移动不会进行绘制操作
<2>.画笔控制命令:
(1) turtle.pencolor(*args):设置或返回画笔颜色(设置后海龟箭头的外轮廓也是这个颜色)
turtle.pencolor()
turtle.pencolor("red")
turtle.fd(50)
turtle.pencolor("#33cc8c")
turtle.fd(50)
pencolor(r, g, b)或pencolor((r, g, b))语法设置画笔颜色,取决于颜色模式,colormode颜色模式取值1.0或255,colormode为1.0时r,g,b取值范围0-1.0小数;colormode为255时r,g,b取值范围0-255的整数
turtle.pencolor(50, 60, 70)
turtle.fd(50)
turtle.getscreen().colormode(255)# 打印颜色模式为255
print(turtle.getscreen().colormode())
(2)turtle.fillcolor(*args):返回或设置画笔填充颜色(设置后海龟箭头内部填充也是这个颜色)
print(turtle.fillcolor())
screen = turtle.getscreen()
# pencolor(colorstring)语法设置画笔颜色
turtle.fillcolor("red")
turtle.fd(50)
# fillcolor(colorstring)语法设置画笔颜色
turtle.fillcolor("#33cc8c")
turtle.fd(50)
fillcolor(r, g, b)fillcolor((r, g, b))语法设置画笔颜色,取决于颜色模式,colormode颜色模式取值1.0或255,colormode为1.0时r,g,b取值范围0-1.0小数;colormode为255时r,g,b取值范围0-255的整数
screen.colormode(1.0)
# 打印颜色模式为1.0
print(screen.colormode())
turtle.fillcolor(0.1, 0.2, 0)
turtle.fd(50)
screen.colormode(255)
# 打印颜色模式为255
print(screen.colormode())
turtle.fillcolor(30, 210, 180)
turtle.fd(50)
(3)turtle.color(*args)设置或返回pencolor和fillcolor
(4)turtle.filling()返回填充状态(填充状态则返回True,否则返回False)、开始填充图形之前先调用turtle.begin_fill()、填充完图形后调用turtle.end_fill()
print(turtle.filling())
turtle.begin_fill()# 绘制shape之前先准备开始fill
print(turtle.filling())# 返回True
turtle.circle(20, None, 6)
turtle.end_fill()# 绘制完shape之后结束fill
print(turtle.filling())# 返回False
<3>.全局控制命令:
(1)turtle.undo()
每调用一次就撤销最后的一次动作,需要撤销所有可通过while turtle.undobufferentries(),turtle.undobufferentries()返回当前可撤销次数
turtle.undo()
(2)turtle.reset():清屏并将画笔位置和方向恢复到初始状态,保持画笔形状不变,即位置恢复到原点(0, 0)位置
turtle.reset()
(3)turtle.write(arg, move=False, align=“left”, font=(“Arial”, 8, “normal”))
arg:待绘制的文本
move:True/False 设置是否绘制
align:设置文本下方初始位置
font :设置字体
#默认False不绘制
turtle.write("Home = ", True, align="center")
turtle.write((0,0), True)
turtle.setpos(x, y=None) | turtle.setposition(x, y=None) | turtle.goto(x, y=None)
移动到绝对位置,如果画笔按下,就画线
参数x(a number or a pair/vector of numbers)
参数y(a number or None)
如果y为None,x必须是a pair of coordinates or a Vec2D
turtle.setpos((20,80))
turtle.setposition(120,20)
turtle.goto(60,30)
turtle.stamp(),turtle.clearstamp(stamp_id),turtle.clearstamps(n=None):
turtle.stamp()是在当前位置拷贝一份此时箭头的形状,返回一个stamp_id(int型),
turtle.clearstamp(stamp_id)用来删除指定stamp_id的箭头形状
turtle.clearstamps(n=None),n为None时表示删除所有拷贝的箭头形状;为0不删除;n > 0 表示删除前n个,n < 0 表示删除后n个
5.获取画笔的状态
(1) position() | pos()返回(海龟)箭头当前位置坐标
turtle.pos()
(2)turtle.towards(x, y=None)返回(海龟)箭头当前位置指向(x,y)位置连线的向量的角度(取决于当前模式,“standard”/”world”默认方向向右(即东)逆时针开始;“logo”模式默认方向向上(即北)顺时针开始)
x:x可以是一个number或一个pair/vector of numbers或一个turtle instance
y:x是一个number,y就是一个number;否则y为None
angle = turtle.towards((0, 0))
print("两向量角度:", angle)
turtle1 = turtle.Turtle()
turtle1.setpos(0, 0)
angle = turtle.towards(turtle1)#
print("两向量角度:", angle)
(3)turtle.xcor() 和 turtle.ycor()
turtle.xcor()是返回(海龟)箭头的x坐标,turtle.ycor()是返回(海龟)箭头的y坐标
turtle.lt(50)
turtle.fd(100)
print(turtle.pos())
print(round(turtle.xcor(), 5))
print(round(turtle.ycor(), 5))
(4)turtle.heading()返回当前箭头方向角度,取决于当前模式mode,“standard”模式时默认方向向右逆时针计算角度;“logo”模式默认方向向上,顺时针计算角度
(5)turtle.distance(x, y=None)返回当前(海龟)箭头坐标与坐标(x,y)间距离或当前(海龟)箭头坐标与另一个(海龟)箭头坐标间距离
x:x可以是一个number或一个pair/vector of numbers或一个turtle instance
y:x是一个number,y就是一个number;否则y为None
(6)turtle.width(width=None) | turtle.pensize(width=None)
设置或返回线的粗细(width=None时表示返回,不为None表示设置),注意如果resizemode设置成"auto"并且绘制的是多边形,则多边形绘制时使用相同的线条粗细
(7)turtle.pen(pen=None, **pendict)
设置或返回画笔字典中对应的画笔属性(一个键值对)
# (pendict)画笔字典键值对如下
“fillcolor”: color-string or color-tuple
“outline”: positive number
“pencolor”: color-string or color-tuple
“pendown”: True/False
“pensize”: positive number
“resizemode”: “auto” or “user” or “noresize”
“shearfactor”: number
“shown”: True/False
“speed”: number in range 0..10
“stretchfactor”: (positive number, positive number)
“tilt”: number
print(sorted(turtle.pen().items()))
turtle.fd(100)
penstate=turtle.pen()
turtle.pen(penstate, fillcolor="green")
(8)turtle.isdown():获取画笔是否按下,按下返回True,否则返回False
turtle.pu()
print(turtle.isdown())# 打印False
turtle.pd()
print(turtle.isdown())# 打印True
6.设置与测量
(1)turtle.degrees(fullcircle=360.0) 和 turtle.radians()
turtle.degrees表示设置一个完整圆的“度数”。默认值为360度,参数fullcircle(number类型),如果是360度时的90度,假如改成整圆为400度则此时角度应该是90/360400
(2)turtle.radians()表示将一个完整圆的“度数”设置成2π,如果是360度时的90度则此时角度应该是90/360(2π)
turtle.home()
turtle.left(90)# 输出(360份里的90份)90.0
print(turtle.heading())# 将一个完整圆的“度数”从360度改成400度
turtle.degrees(400.0)# 输出(400份里的100份)100.0
print(turtle.heading())# 将一个完整圆的“度数”设置成360度
turtle.degrees(360)# 输出(360份里的90份)90.0
print(turtle.heading())
turtle.radians()# 输出(2π份里的1.5707963267948966份)1.5707963267948966
print(turtle.heading())
7.绘制状态:
(1)turtle.hideturtle():隐藏画笔,此时只要画笔是按下状态,虽然隐藏了但是还是能绘制图形的,复杂的快速绘图时效果显著
turtle.hideturtle()
(2)turtle.showturtle():显示画笔(即海龟箭头)
turtle.showturtle()
(3)turtle.isvisible() 返回(海龟)画笔当前是否是可见状态,可见返回True,否则返回False
turtle.hideturtle()
print(turtle.isvisible())# 返回False
turtle.showturtle()
print(turtle.isvisible())# 返回True
(4)turtle.shape(name=None)
name:形状名,必须在TurtleScreen的形状字典中,如(粗大箭头1)“arrow”,(海龟箭头) “turtle”, (实心圆箭头)“circle”, (实心方形箭头)“square”, (粗大箭头2)“triangle”, 默认的箭头“classic”
(5) turtle.resizemode(rmode=None)
rmode :“auto”, “user”, “noresize”,3选1,具体说明如下
“auto”: 此模式下(海龟)画笔箭头随 pensize变化而变化.
“user”: 此模式下(海龟)画笔箭头大小取决于通过shapesize()进行设置的.stretchfactor和outlinewidth (outline)的值
“noresize”:此模式下(海龟)画笔箭头大小不变
设置或返回(海龟)画笔箭头大小的缩放模式
(6)turtle.shapesize(stretch_wid=None,stretch_len=None,outline=None) | turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None)
stretch_wid :positive number 与当前箭头方向的垂直方向上的拉伸值
stretch_len : positive number 与当前箭头方向上的拉伸值
outline :positive number shape轮廓宽度值
返回或设置画笔x/y方向拉伸值和(或)shape轮廓宽度,仅当resizemode为“user”模式时有效
(7)turtle.shearfactor(shear=None)
shear:number (optional):设置或返回剪切因子,
(8)turtle.tilt(angle)
angle : a number 箭头图标在现有角度基础上再旋转的角度
(9)turtle.tiltangle(angle=None)
angle : a number 忽略箭头现在的旋转角度,旋转到指定的角度数
(10)turtle.get_shapepoly()
返回当前多边形的坐标对,一般用来定义一个新形状或作为一个复合形状的一部分
8.控制使用的事件:
(1)turtle.onclick(fun, btn=1, add=None)
fun :一个有两个参数x,y的函数,画布上鼠标左键在当前海龟箭头位置按下时将点击的坐标作为参数,调用该方法
num:鼠标按钮的数目,默认为1(鼠标左键)
add:True或False.如果是True,将添加一个新的绑定;否则将替换前绑定
画布上鼠标左键在当前海龟箭头位置按下时绑定一个函数;如果函数为None,则移除存在的绑定
(2)turtle.onrelease(fun, btn=1, add=None)
fun :一个有两个参数x,y的函数,画布上鼠标左键在当前海龟箭头位置弹起时将点击的坐标作为参数,调用该方法
num :鼠标按钮的数目,默认为1(鼠标左键)
add :True或False.如果是True,将添加一个新的绑定;否则将替换前绑定
(3)turtle.ondrag(fun, btn=1, add=None)
fun :一个有两个参数x,y的函数,画布上鼠标左键在当前海龟箭头位置按下并拖动时将点击的坐标作为参数,调用该方法
num:鼠标按钮的数目,默认为1(鼠标左键)
add :True或False.如果是True,将添加一个新的绑定;否则将替换前绑定
9.特殊绘制方法:
(1)turtle.begin_poly()、turtle.end_poly()和turtle.get_poly()配合使用
(2)turtle.begin_poly()表示开始记录多边形第一个顶点
(3)turtle.end_poly()表示结束记录多边形顶点
(4)turtle.get_poly()表示获取最后记录的多边形
(5)turtle.clone()创建和返回具有相同位置、方向和海龟箭头属性的海龟的克隆
(6)turtle.getturtle() | turtle.getpen()返回当前海龟屏幕上第一个海龟对象本身
(7)turtle.getscreen() 返回绘制着海龟的海龟屏幕对象,获取该对象后就可以调用海龟屏幕对象的一些方法了
(8)turtle.setundobuffer(size)
size :设置undo()可撤销的最大次数
设置或禁用撤销功能, size为None表示禁用撤销功能;否则设置多大,就可以通过调用undo()方法撤销多少次
turtle.setundobuffer(5)
(9)turtle.undobufferentries()获取当前剩余可撤销次数