内容正文:
单元8 Python标准库
任务8-1:绘制五角星
【任务目标】
使用turtle库绘制图8-1所示的五角星。
【任务实施】
演示过程……
8.1绘图工具:turtle库
本节主要内容:
窗体函数
画笔控制函数
画笔运动函数
形状函数
输入输出函数
事件处理相关函数
turtle库(也称海龟绘图库)提供了基本绘图功能,它起源于1969年诞生的Logo语言。
turtle库提供了简单、直观的绘图方法,Python接纳了turtle库,并将其作为标准库提供给用户。
turtle库的文件为turtle.py,其位于Python安装目录下的“Lib”子目录中。
绘图之前,应导入turtle模块。
例如:
from turtle import *
turtle库也称海龟绘图库,提供几何绘图功能,它最早在Logo语言中实现。因为简单、易用,Python将其作为标准库提供给用户。
turtle库在绘图窗口中完成绘图,绘图窗口的坐标系如图8-2所示。
默认情况下,绘图窗口的中心为坐标原点,x轴正方向为前进方向(即画笔的朝向),x轴负方向为后退方向;画笔的朝向的左侧为左侧方向,右侧为右侧方向。turtle库通过移动画笔完成绘图。
turtle库提供面向过程和面向对象两种接口。面向过程接口提供可直接调用的函数,面向对象接口本书不做介绍。
turtle库的面向过程接口提供的函数主要包括窗体函数、画笔控制函数、画笔运动函数、形状函数、输入输出函数以及事件处理函数等。所有函数的第一个参数默认为self,本书在介绍各个函数时均省略了该参数。
8.1.1 窗体函数
1.turtle.bye()
关闭绘图窗口,示例代码如下。
turtle.bye()
2.turtle.exitonclick()
单击时关闭绘图窗口,示例代码如下。
turtle.exitonclick()
3.turtle.setup(width, height, startx, starty)
设置绘图主窗口的大小和位置。各参数作用如下。
width:整数表示窗口宽度为多少像素;浮点数表示窗口宽度占屏幕的百分比(默认50%)。
height:整数表示窗口高度为多少像素;浮点数表示窗口高度占屏幕的百分比(默认75%)。
startx:正数表示窗口位置距离屏幕左边缘多少像素,负数表示距离屏幕右边缘的像素数,None(默认值)表示窗口水平居中。
starty:正数表示窗口位置距离屏幕上边缘多少像素,负数表示距离屏幕下边缘的像素数,None(默认值)表示窗口垂直居中。
示例代码如下。
>>> turtle.setup(200,180,0,0) #窗口大小200*180,位置在屏幕左上角
>>> turtle.setup(0.5,0.6) #窗口宽为屏幕50%,高为屏幕60%,位置在屏幕中央
4.turtle.screensize(canvwidth, canvheight, bg)
设置绘图窗口中画布的大小,无参数时返回画布大小。各参数的作用如下。
canvwidth:正整型数,以像素表示画布的新宽度值。
canvheight:正整型数,以像素表示画面的新高度值。
bg:颜色字符串,新的背景颜色。
示例代码如下。
>>> turtle.screensize(300,400)
>>> turtle.screensize()
(300, 400)
turtle库中使用的颜色有3种表示方法。
颜色名称字符串:red、blue、yellow等。
十六进制颜色值字符串:#FF0000、#00FF00、#FFFF00等。
RGB颜色元组:
颜色元组格式为(r,g,b),r、g、b的取值范围为0~colormode。
colormode为颜色模式,取值为1或255。
turtle.colormode(n)函数设置颜色模式(n取值1或255)。
例如:
颜色模式为255:(255,0,0)、(0,210,0)、(155,215,0)等是有效的颜色元组
颜色模式为1时:(1,0,0)、(0,0.3,0)、(1,0.5,0)等是有效的颜色元组。
示例代码如下。
>>> turtle.screensize(300,400,'yellow')
5.turtle.bgcolor(*args)
设置背景颜色,无参数时返回当前背景颜色。
参数args是一个颜色字符串或颜色元组,或者是3个取值范围为0~colormode内的数值(即省略圆括号的颜色元组)。
示例代码如下。
>>> turtle.bgcolor((0.5,0,0))
>>> turtle.bgcolor()
(0.5019607843137255, 0.0, 0.0)
>>> turtle.bgcolor('red')
>>> turtle.bgcolor()
'red'
>>> turtle.bgcolor(0.6,0.3,0.7)
6.turtle.bgpic(picname=None)
设置背景图片或返回当前背景图片名称。
如果picname为一个以gif或png为后缀名的图片文件名,则将相应图片设为背景。
如果picname为“nopic”,则删除当前背景图片。
未提供参数时返回当前背景图片文件名。
示例代码如下。
>>> turtle.bgpic()
'nopic'
>>> turtle.bgpic('back.png')
7.turtle.clear()和turtle.clearscreen()
从绘图窗口中删除全部绘图,将绘图窗口重置为初始状态:
白色背景
无背景图片
无事件绑定并启用追踪。
示例代码如下。
>>> turtle.clear()
>>> turtle.clearscreen()
8.turtle.reset()和turtle.resetscreen()
将绘图窗口中的画笔重置为初始状态,示例代码如下。
>>> turtle.reset()
>>> turtle.resetscreen()
9.turtle.window_height()和turtle.window_width()
返回绘图窗口的高度和高度,示例代码如下。
>>> turtle.window_height()
576
>>> turtle.window_width()
683
8.1.2 画笔控制函数
1.turtle.pendown()、turtle.pd()和turtle.down()
画笔落下,移动画笔时画线,示例代码如下。
>>> turtle.pendown()
2.turtle.penup()、turtle.pu()和turtle.up()
画笔抬起,移动画笔时不画线,示例代码如下。
>>> turtle.penup()
3.turtle.pensize(width=None)和turtle.width(width=None)
参数with为一个正数。
提供参数with时,将其设置为画笔大小,画笔大小决定线条粗细。
如未指定参数,则返回画笔的当前大小。
示例代码如下。
>>> turtle.pensize()
1
>>> turtle.pensize(5)
4.turtle.pen(pen=None, **pendict)
提供参数时设置画笔属性;未指定参数时返回画笔属性。
参数pen为字典。
pendict为一个或多个关键字参数,可用的关键字及其取值如下。
shown: 值为True(显示画笔形状)或False(不显示画笔形状)。
pendown:值为True(画笔落下)或False(画笔抬起)。
pencolor:值为颜色字符串或颜色元组,用于设置画笔颜色。
fillcolor:值为颜色字符串或颜色元组,用于设置填充颜色。
pensize:值为正数,用于设置画笔大小。
speed:值为0~10范围内的数,用于设置绘图速度。
resizemode:值为“auto”“user”或“noresize”,用于设置绘图窗口大小调整模式。
stretchfactor:值为“(正数值,正数值)”格式的元组,用于设置画笔裁剪比例。
outline:值为正数,用于设置轮廓宽度。
tilt:值为整数或小数,用于设置画笔倾斜角度。
示例代码如下。
>>> turtle.pen(fillcolor="yellow", pensize=5) #设置关键字参数
>>> turtle.pen({'shown':False,'tilt':15}) #使用字典参数
>>> turtle.pen()
{'pencolor': 'black', 'shown': False, 'speed': 3, 'pendown': True, 'shearfactor': 0.0, 'resizemode': 'noresize', 'outline': 1, 'stretchfactor': (1.0, 1.0), 'tilt': 15, 'pensize': 5, 'fillcolor': 'yellow'}
5.turtle.isdown()
画笔落下时返回True,画笔抬起时返回False,示例代码如下。
>>> turtle.penup()
>>> turtle.isdown()
False
>>> turtle.pendown()
>>> turtle.isdown()
True
6.turtle.pencolor(*args)
提供参数时设置画笔颜色,未提供参数时返回画笔颜色,示例代码如下。
>>> colormode()
1.0
>>> turtle.pencolor()
'red'
>>> turtle.pencolor("blue")
>>> turtle.pencolor()
'blue'
>>> turtle.pencolor((0.3, 0.5, 0.6))
>>> turtle.pencolor('#FF00FF')
7.turtle.fillcolor(*args)
提供参数时设置填充颜色
未提供参数时返回填充颜色
示例代码如下。
>>> turtle.fillcolor("yellow")
>>> turtle.fillcolor()
' yellow'
8.turtle.color(*args)
提供两个颜色参数,分别设置为画笔颜色和填充颜色;
未提供参数时返回画笔颜色和填充颜色。
示例代码如下。
>>> turtle.color()
('black', 'yellow')
>>> turtle.color("red", "green")
9.turtle.filling()
返回填充状态,要填充是返回True,不填充时返回False。
10.turtle.begin_fill()
开始填充,在绘制填充形状之前调用。
11.turtle.end_fill()
结束填充,同时执行填充操作,填充调用begin_fill()之后绘制的封闭形状。
12.turtle.clone()
创建并返回画笔的克隆体,克隆体具有与画笔相同的位置、朝向和其他属性。
克隆得到的画笔可以设置与原画笔不同的属性,执行不同的绘图操作。
示例代码如下。
>>> t2=turtle.clone()
turtle允许使用多个画笔,可调用Turtle()函数创建画笔,
示例代码如下。
>>> t3=turtle.Turtle()
8.1.3 画笔运动函数
8.1.3 画笔运动函数
1.turtle.forward(distance)和turtle.fd(distance)
画笔前进distance指定的距离,参数distance为像素值,不改变画笔的朝向,示例代码如下。
>>> turtle.forward(50)
2.turtle.back(distance)、turtle.bk(distance)和turtle.backward(distance)
画笔后退distance指定的距离,不改变画笔的朝向,示例代码如下。
>>> turtle.backward(50)
3.turtle.right(angle)和turtle.rt(angle)
画笔向右旋转angle个单位,单位默认为角度,可调用turtle.degrees()和turtle.radians()函数设置度量单位。
角度的正负由画笔模式确定,可调用turtle.mode()函数设置画笔模式。
函数turtle.degrees()将角度的度量单位设置为度,turtle.radians()将角度的度量单位设置为弧度。
示例代码如下。
>>> turtle.degrees() #设置角度单位为度
>>> turtle.heading() #画笔当前朝向
0.0
>>> turtle.right(60) #画笔向右旋转60度
>>> turtle.heading()
300.0
4.turtle.mode(mode=None)
设置或返回画笔模式(即画布的坐标系)
参数mode为字符串“standard”“logo”或“world”。“standard”模式与旧版本的turtle兼容,“logo”模式与大部分Logo画笔绘图兼容,“world”模式使用用户自定义的“世界坐标系”。
模式、画笔初始朝向和角度正负之间的关系如下。
standard模式:画笔初始朝右(东)、逆时针为角度正方向。
logo模式:画笔初始朝上(北)、顺时针为角度正方向。
示例代码如下。
>>> turtle.mode('logo')
>>> turtle.heading()
0.0
>>> turtle.right(60)
>>> turtle.heading()
60.0
5.turtle.left(angle)和turtle.lt(angle)
画笔向左旋转angle个单位,示例代码如下。
>>> turtle.left(45)
6.turtle.goto(x, y=None)、turtle.setpos(x, y=None)和turtle.setposition(x, y=None)
将画笔移动到绝对坐标的位置。
如果画笔已落下将画直线。不改变画笔的朝向。
同时提供参数x和y时,(x,y)为新坐标。省略参数y时,x为坐标向量。
示例代码如下。
>>> turtle.pos() #查看画笔当前位置
(0.00,0.00)
>>> turtle.goto(20,30) #移动画笔到(20,30)
>>> turtle.pos()
(20.00,30.00)
>>> turtle.goto((50,50)) #移动画笔到(50,50)
7.turtle.setx(x)
画笔水平移动,横坐标变为x,纵坐标保持不变,示例代码如下。
>>> turtle.pos()
(50.00,50.00)
>>> turtle.setx(100)
>>> turtle.pos()
(100.00,50.00)
8.turtle.sety(y)
画笔垂直移动,横坐标不变,纵坐标变为y,示例代码如下。
>>> turtle.pos()
(100.00,50.00)
>>> turtle.sety(100)
>>> turtle.pos()
(100.00,100.00)
9.turtle.setheading(to_angle)和turtle.seth(to_angle)
将画笔的方向设置为to_angle(注意由画笔模式决定具体方向)
示例代码如下。
>>> turtle.setheading(45)
10.turtle.home()
将画笔移至初始坐标(0,0),并设置方向为初始方向(由画笔模式确定),示例代码如下。
>>> turtle.pos() #当前位置
(100.00,100.00)
>>> turtle.heading() #当前朝向
15.0
>>> turtle.home() #画笔回归原点,重置为初始朝向
>>> turtle.heading()
0.0
>>> turtle.pos()
(0.00,0.00)
11.turtle.circle(radius, extent=None, steps=None)
绘制一个半径为radius的圆,圆心在画笔左侧radius个单位的位置。
参数radius为数值,extent为数值或None,steps为整数或None。
extent为一个角度,省略时绘制圆,指定extent参数时绘制指定角度的圆弧。
绘制圆弧时,如果radius为正值,则沿逆时针方向绘制圆弧,否则沿顺时针方向绘制圆弧。最终画笔的朝向由extent的值决定。
turtle库实际上是用内切正多边形来近似表示圆,其边的数量由steps指定。
省略steps参数时自动确定边数。此方法也可用来绘制正多边形。
示例代码如下。
>>> turtle.circle(50) #绘制半径为50的圆
>>> turtle.circle(100,180) #绘制半径为100的半圆
>>> turtle.circle(200,None,4) #绘制对角线长度为200的正方形
>>> turtle.circle(200,steps=6) #绘制对角线长度为200的正六边形
12.turtle.dot(size=None, *color)
绘制一个直径为size,颜色为color的圆点。
如果未指定size,则直径取pensize+4和2*pensize中的较大值,
示例代码如下。
>>> turtle.dot() #绘制默认大小的点。
>>> turtle.dot(100) #绘制直径为100的点
>>> turtle.dot(50,'red') #绘制直径为50的点,颜色为红色
13.turtle.stamp()
在画笔当前位置印制一个印章(画笔形状),返回该印章的stamp_id,示例代码如下。
>>> turtle.stamp()
19
14.turtle.clearstamp(stampid)
删除stampid指定的印章,stampid是调用stamp()的返回值,示例代码如下。
>>> turtle.clearstamp(19)
15.turtle.clearstamps(n=None)
参数n为整数或None。n为None则删除全部印章, n>0则删除前n个印章,n<0则删除后n个印章,示例代码如下。
>>> turtle.clearstamps(5)
16.turtle.undo()
撤消最近的一个画笔动作,可撤消的次数由撤消缓冲区的大小决定,示例代码如下。
>>> turtle.undo()
17.turtle.speed(speed=None)
设置画笔的移动速度。
不指定参数(或为None)时返回画笔的移动速度。
参数speed为0~10范围内的整数或速度字符串,除0以外的速度值越大绘图速度越快(0表示没有动画效果)。
可用的速度字符串与速度值的对应关系如下。
fastest:0,最快。
fast:10,快。
normal:6,正常。
slow:3,慢。
slowest:1,最慢。
示例代码如下。
>>> turtle.speed()
3
>>> turtle.speed('fast')
>>> turtle.speed()
10
>>> turtle.speed(6)
18.turtle.position()和turtle.pos()
返回画笔当前的坐标,示例代码如下。
>>> turtle.pos()
(100.00,100.00)
19.turtle.xcor()
返回画笔的x坐标。
20.turtle.ycor()
返回画笔的y坐标。
21.turtle.heading()
返回画笔的当前朝向。
22.turtle.distance(x, y=None)
返回从画笔位置到坐标(x,y)或另一画笔对应位置的距离。
参数x为画笔对象时,y为None
示例代码如下。
>>> turtle.home()
>>> turtle.goto(100,100)
>>> turtle.distance(0,0)
141.4213562373095
8.1.4 形状函数
1.turtle.getshapes()
返回画笔形状列表,列表包含当前可用的所有画笔形状的名称,示例代码如下。
>>> turtle.getshapes()
['arrow', 'blank', 'circle', 'classic', 'square', 'triangle', 'turtle']
2.turtle.shape(name=None)
将画笔形状设置为name指定的形状,如未提供参数则返回当前的画笔形状的名称,示例代码如下。
>>> turtle.shape('turtle') #将画笔设置为海龟形状
3.turtle.begin_poly()
开始记录多边形的顶点,当前画笔位置为多边形的第一个顶点。
4.turtle.end_poly()
停止记录多边形的顶点,当前画笔位置为多边形的最后一个顶点,它将连线到第一个顶点。
5.turtle.get_poly()
返回最新记录的多边形,示例代码如下。
>>> turtle.begin_poly() #开始记录
>>> turtle.fd(50)
>>> turtle.lt(60)
>>> turtle.fd(50)
>>> turtle.lt(60)
>>> turtle.fd(50)
>>> turtle.lt(60)
>>> turtle.fd(50)
>>> turtle.lt(60)
>>> turtle.fd(50)
>>> turtle.end_poly() #结束记录正六边形
>>> p=turtle.get_poly() #返回刚记录的多边形
>>> p
((0.00,0.00), (50.00,0.00), (75.00,43.30), (50.00,86.60), (0.00,86.60), (-25.00,43.30))
记录的多边形为顶点坐标的元组。
6.turtle.register_shape(name,shape=None)和 turtle.addshape(name, shape=None)
为画笔注册新的形状。调用此函数有3种不同方式。
(1)参数name为形状的注册名称,shape为Shape对象。
示例代码如下。
>>> turtle.register_shape('sixpoly',p) #将多边形注册为画笔形状
>>> turtle.shape('sixpoly') #使用多边形作为画笔形状
(2)参数name为一个GIF文件的文件名,参数shape为None或者省略,GIF文件应放在当前工作目录中。参数name中不能包含路径。
示例代码如下。
>>> turtle.register_shape("star.gif")
>>> turtle.getshapes()
['arrow', 'blank', 'circle', 'classic', 'square', 'star.gif', 'triangle', 'turtle']
>>> turtle.shape('star.gif') #使用已注册的gif文件图片作为画笔形状
(3)参数name为形状的注册名称字符串,shape为形状的顶点坐标元组
示例代码如下。
>>> turtle.register_shape("myTri",((0,-5),(5,0),(0,5)))
>>> turtle.getshapes()
['arrow', 'blank', 'circle', 'classic', 'myTri', 'square', 'star.gif', 'triangle', 'turtle']
7.使用复合形状
复合形状由多个不同颜色的多边形构成。
使用复合形状包含下列步骤。
创建一个类型为“compound”的Shape对象。
调用addcomponent()方法为Shape对象添加多边形。
注册Shape对象,并将其设置为画笔形状。
示例代码如下。
>>> s = turtle.Shape("compound") #创建空的复合形状对象
>>> p = ((0,0),(50,0),(50,50),(0,50)) #定义多边形顶点
>>> s.addcomponent(p, "red", "blue") #将多边形添加到复合形状对象
>>> p = ((10,10),(40,10),(40,40),(10,40))
>>> s.addcomponent(p, "blue", "red")
>>> p = ((20,20),(30,20),(30,30),(20,30))
>>> s.addcomponent(p, "red", "blue")
>>> turtle.register_shape("mycs", s) #注册复合形状对象
>>> turtle.shape('mycs') #将复合形状设置为画笔形状
8.1.5 输入输出函数
1.turtle.write(arg, move=False, align="left", font=("Arial", 8, "normal"))
将对象arg输出到画笔位置。
参数move为True时(默认为False),画笔会移动到文本的右下角。
参数align指定文本对齐方式,可取值“left”“center”或“right”,对齐位置为画笔当前位置。
参数font是一个三元组(fontname, fontsize, fonttype),用于指定字体名称、字号和字体类型。参数font默认为("Arial", 8, "normal"),
示例代码如下。
>>> turtle.home()
>>> turtle.write((0.0))
>>> turtle.write("Python", True, align="center")
2.turtle.textinput(title, prompt)
用对话框输入字符串。参数title为对话框的标题,prompt为提示信息。
函数返回输入的字符串,取消对话框时返回None,
示例代码如下。
>>> turtle.textinput("Turtle绘图", "请输入一个字符串")
'Python编程'
3.turtle.numinput(title, prompt, default=None, minval=None, maxval=None)
用对话框输入数值。
参数title为对话框标题,prompt为提示信息,default为输入框初始值,minval为允许输入的最小值,maxval为允许输入的最大值。
函数返回输入的数值,取消对话框时返回None。
示例代码如下。
>>> turtle.numinput("Turtle绘图", "请输入一个数值",None,1,10)
8.1.6 事件处理相关函数
1.turtle.mainloop()和turtle.done()
开始事件循环,调用Tkinter库的mainloop()函数,用于实现turtle绘图窗口的交互功能。
应将turtle.mainloop()或turtle.done()作为一个绘图程序的结束语句,否则其后的绘图语句不会执行
示例代码如下。
>>> turtle.done()
2.turtle.listen()
使绘图窗口获得焦点,以便接收键盘和鼠标事件。
3.turtle.onkey(fun, key)和turtle.onkeyrelease(fun, key)
注册按键事件函数,fun为函数名,在按下并释放key指定的键时调用fun()函数。
fun为None时删除事件绑定。
参数key为键字符串,例如“a”或“space”
示例代码如下。
>>> def fun():
... turtle.circle(50)
...
>>> turtle.onkey(fun,'a’) #注册事件函数,在释放字母a键时,调用fun()函数
>>> turtle.listen()
4.turtle.onkeypress(fun, key=None)
与turtle.onkey(fun, key)和turtle.onkeyrelease(fun, key)类似,注册按键事件函数,fun为函数名,在按下(未释放)key指定的键时调用fun()函数。
>>> def fun():
... turtle.fd(50)
... turtle.circle(45)
...
>>> turtle.onkeypress(fun,'b') #在按下键盘上的字母b键时,调用fun()函数
>>> turtle.listen()
注意,在onkey、onkeyrelease和onkeypress等事件发生后,Python执行绑定的函数。
在函数执行过程中,如果发生其他事件,则会中断正在执行的函数,转去执行其他事件的绑定函数。
5.turtle.onclick(fun, btn=1, add=None)和
turtle.onscreenclick(fun, btn=1, add=None)
将函数fun()绑定到鼠标单击事件,fun为None时删除现有的绑定。
参数fun为函数名,调用时将传入两个参数表示鼠标所在点的坐标。
参数btn为1(默认值)时,表示鼠标左键,2表示鼠标中间键,3表示鼠标右键。
参数add为True时将添加一个新绑定,否则将取代先前的绑定。onclick()为画笔绑定鼠标单击事件函数
onscreenclick()为绘图窗口绑定鼠标单击事件函数。
示例代码如下。
>>> def fun(x,y):
... turtle.goto(x,y)
... turtle.circle(45)
...
>>> turtle.onscreenclick(fun) #单击绘图窗口时调用函数fun()
>>> turtle.onclick(fun,3) #右键单击画笔时调用函数fun()
6.turtle.onrelease(fun, btn=1, add=None)
将函数fun()绑定到鼠标释放事件,与turtle.onclick()类似,
示例代码如下。
>>> def fun(x,y):
... turtle.circle(50)
...
>>> turtle.onrelease(fun,3) #在画笔上按下并释放鼠标右键时调用函数fun()
7.turtle.ondrag(fun, btn=1, add=None)
将fun()函数绑定到画笔的拖动事件。
如果fun值为None,则移除现有的绑定。
在拖动画笔时,首先会触发画笔的鼠标单击事件
示例代码如下。
>>> turtle.ondrag(turtle.goto) #拖动画笔在绘图窗口中手绘线条
8.turtle.ontimer(fun, t=0)
创建一个计时器,在t毫秒后调用fun()函数。
fun是函数名称,函数无参数
示例代码如下。
>>> def f():
... turtle.fd(100)
... turtle.circle(50)
...
>>> turtle.ontimer(f) #立即执行f()函数
>>> turtle.ontimer(f,2000) #2秒后执行f()函数
$$