第5章 turtle 库 turtle库诞生于1966年,是基于LOGO 编程语言的图形绘制函数库,将 较为枯燥的程序设计形象化,能在发现和探索中学习编程,强调创造性的探 索和计算思维的训练。由于其简单直观、容易掌握,后来被Python引入,成 为Python的一个标准库。 5.1 运行环境设置 使用turtle库绘制图形的过程如下:首先设置画布的大小,然后让一只 小乌龟(画笔)在其中按照坐标爬行,其爬行轨迹就形成了绘制的图形。对于 小乌龟而言,有前进、后退、旋转等爬行行为,其爬行方向包括前进、后退、左 侧、右侧。 刚开始绘制时,小乌龟位于画布的正中央,此处的坐标为(0,0),画布就 是turtle库中设置的绘图区域,可以定义它的大小和初始位置。具体设置格 式有以下两种(单独、同时使用均可)。 (1)turtle.screensize(width,height,bg):参数分别为画布的宽、高、背 景颜色。其中,宽和高的单位均为像素。 (2)turtle.setup(width,height,startx,starty):参数width和height分 别表示宽和高,为整数时,表示像素;为小数时,表示占据计算机屏幕的比例。 参数startx和starty分别表示距离屏幕左上角顶点的横向和纵向距离,如果 同时为空,则窗口位于屏幕中心。 例如: turtle.screensize(800,600,"green") 表示设置宽800像素、高600像素、背景色为绿色的画布,位置在屏幕中央。 其中常用的背景色有white(白色)、black(黑色)、grey(灰色)、darkgreen(深 绿色)、gold(金色)、violet(淡紫色)、purple(紫色)、red(红色)、blue(蓝色)等。 又如: turtle.setup(width=400,height=300, startx=200, starty=100) 或 turtle.setup(400, 300, 200, 100) 表示设置宽400像素、高300像素的画布,其左上角距离屏幕左上角顶点的横向和纵向距 离分别为200像素和100像素。 5.2 画笔设置 5.2.1 画笔基本参数 .turtle.pensize(width):设置画笔的宽度,单位是像素。 .turtle.pencolor(color):设置画笔颜色。如果没有参数传入,则返回当前画笔颜 色。可以是字符串如green、red,也可以是RGB三元组。 .turtle.colormode(n):设置RGB颜色三元组的模式,n=1(默认值)或255,颜色三 元组的(R,G,B)值必须在0~n 的范围内。 .turtle.penup():抬起画笔,之后移动画笔不绘制图形。 .turtle.pendown():落下画笔,之后移动画笔将绘制图形。 .turtle.speed(speed):设置画笔移动速度。画笔移动的速度为[0,10]上的整数, speed为正整数,实际速度为1/speed秒,speed=0时速度最快。 .turtle.shape(name):设置画笔形状。参数name可以是arrow、blank、circle、 classic、square、triangle和turtle,分别表示箭头、空白、圆形、经典、方形、三角形 和乌龟。默认形状是classic(经典)。 5.2.2 画笔运动命令 .turtle.forward(distance):向当前画笔方向移动distance像素长度。 .turtle.backward(distance):向当前画笔相反方向移动distance像素长度。 .turtle.right(degree):顺时针移动degree角度。 .turtle.left(degree):逆时针移动degree角度。 .turtle.goto(x,y):将画笔移动到坐标为(x,y)的位置。 .turtle.circle():画圆,半径为正(负)数,表示圆心在画笔的左边(右边)。 .turtle.setx():将当前x 轴移动到指定位置。 .turtle.sety():将当前y 轴移动到指定位置。 .turtle.setheading(angle):设置当前朝向为angle角度。 .turtle.home():设置当前画笔位置为原点,朝向东。 .turtle.dot(r):绘制一个指定直径和颜色的圆点。 需要注意绝对角度和相对角度的区别:绝对角度是相对于画布而言的,因为画布是 静止不动的,所以以画布为中心构建的角度坐标系的角度是不会发生变化的,例如90°是 ·61· 指正北方向。turtle.seth(angle)函数中的角度就是绝对角度;相对角度是以画笔本身的 方向为中心建立的角度坐标系的角度,是时刻在变动的,例如turtle.left(angle)、turtle .right(angle)中的角度就是相对角度。 5.2.3 画笔控制命令 .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.Pen():定义多支画笔。例如,a=turtle.Pen(),以后可以使用a.goto(x,y) 等函数进行绘图。 .onscreenclick():监听鼠标在画布上按下事件,一旦事件发生,就会调用以函数参 数形式传入的处理函数。例如: import turtle def show(x,y): print(x,y) turtle.onscreenclick(show) .turtle.write(s[,font=("font_name",font_size,"font_type")]):写文本,s为文 本内容,font是字体的参数,font_name、font_size和font_type分别为字体名称、 大小和类型。font参数为可选项,font_name、font_size和font_type也是可选项。 5.3 应用实例 【例5-1】 绘制太阳花,如图5-1所示。 图5-1 太阳花 ·62· 编程思路:如图5-2所示,从起点开始,默认方向是正东0°,第一次使画笔移动200 像素,以当前角度向左(逆时针)方向偏移170°,并沿此方向使画笔第二次移动200像素, 以此类推,循环36次回到原点,填充图形。 图5-2 太阳花绘制原理 程序代码如下: import turtle turtle.color("red", "yellow") #设置画笔和填充颜色 turtle.begin_fill() #开始 for i in range(36): #36 次循环 turtle.forward(200) #前进200 像素 turtle.left(170) #向左偏移170° turtle.end_fill() #填充 turtle.mainloop() #启动事件循环 【例5-2】 绘制五角星,如图5-3所示。 图5-3 五角星 程序代码如下: import turtle turtle.pensize(5) #设置画笔宽度 turtle.colormode(255) #设置三元组数据模式为0~255 turtle.pencolor(255,255,0) #设置画笔颜色 turtle.fillcolor(255,0,0) #设置填充颜色 turtle.begin_fill() for i in range(5): ·63· turtle.forward(200) turtle.right(144) #向右偏转144° turtle.end_fill() turtle.penup() #抬起画笔 turtle.goto(70,-140) #定位 turtle.color("violet") #设置颜色 turtle.write("Done", font=('Arial', 20, 'normal')) #写文字 turtle.mainloop() 【例5-3】 绘制旋转的正方形,如图5-4所示。 编程思路:如图5-5所示,首先从第一个起点开始移动画笔,向左偏转90°,循环4 次,绘制完成第一个正方形。将画笔移动到第二个起点,向左偏转45°,绘制第二个正方 形。这样循环8次即可。 图5-4 正方形的旋转 图5-5 正方形的旋转编程思路 程序代码如下: from turtle import * d=120 setup(800,600,300,400) #设置图形边界 turtle.colormode(1) #设置三元组数据模式为0~1 turtle.pencolor(1,0,0) #设置画笔颜色 pensize(4) for i in range(8): #大循环8 次 for j in range(4): #小循环4 次 forward(d) left(90) penup() forward(d) pendown() left(45) 【例5-4】 绘制空心五角星,如图5-6所示。 编程思路:如图5-7所示,首先绘制第一个三角形,从第一个起点开始,初始角度 A =0°,移动d =100,再向左偏转108°,移动d1=1.618d,再向左偏转144°,移动d1= 1.618d,完成第一个三角形的绘制,并填充。角度不变,抬起笔,沿着上次的角度前进 d=100,落下笔,第二个起点确定,使A =A +72°,重复第一次的画法。这样循环5次,完 成图形的绘制。 ·64· 图5-6 空心五角星 图5-7 空心五角星的编程思路 程序代码如下: from turtle import * d=100 d1=d*1.618 setup(800,600,300,200) pensize(8) color('yellow','red') A=0 for i in range(5): seth(A) #设置绝对角度 begin_fill() forward(d) #前进100 像素 left(108) #左偏转108° forward(d1) #前进161.8 像素 left(144) #左偏转144° forward(d1) #前进161.8 像素 end_fill() #填充 up() #抬笔 forward(d) #沿着最后的角度前进100 像素 down() #笔落下 A=A+72 #改变初始角度,5 次刚好360° 【例5-5】 绘制六边形,如图5-8所示。 图5-8 六边形 ·65· 编程思路:分为两个步骤,第1步参照例5-4五角星的代码画出6个三角形并填充, 第2步是将画笔移动到中心,分别画出6个三角形并填充。 程序代码如下: from turtle import * d=100 setup(800,600,300,400) pensize(8) color('yellow','red') A=0 for i in range(6): seth(A) begin_fill() forward(d) left(120) forward(d) left(120) forward(d) end_fill() up() forward(d) down() A=A+60 #移动到中心 up() left(120) forward(d) #调整方向 color('yellow','green') down() A=0 for i in range(6): seth(A) left(60) begin_fill() forward(d) left(120) forward(d) left(120) forward(d) end_fill() A=A+60 【例5-6】 定义三支画笔,设置不同颜色和形状,以中心为起点,相互角度为120°,前 进200像素。 程序代码如下: from turtle import * a=Pen('circle') #圆形 b=Pen('square') #方形 c=Pen('turtle') #乌龟 ·66· a.color('red') b.color('blue') c.color('green') a.seth(0) b.seth(120) c.seth(240) for i in range(200): a.fd(1) b.fd(1) c.fd(1) 程序运行结果如图5-9所示。 图5-9 例5-6运行结果 习题5 一、简答题 1.turtle库有什么作用? 2.turtle库的画布如何设置? 3.turtle库的直线和圆如何绘制? 4.turtle库如何进行图形填充? 5.turtle库中如何书写文字? 二、选择题 1.画笔抬起函数是( )。 A.penup() B.pendown() C.pentop() D.pensize() 2.画笔落下函数是( )。 A.penup() B.pendown() C.pentop() D.pensize() 3.画笔前进函数forward()内的距离参数单位是( )。 A.厘米B.毫米C.英寸D.像素 4.画布的默认原点(0,0)在画布的( )。 A.左上角B.右下角C.中心D.左下角 5.画笔宽度设置函数是( )。 A.penup() B.pensize() C.setup() D.pencolor ·67· 扫码答题 6.trl.ehaig(表示该点( )。 utestedn30) A.左前上方30° B.右前上方30° C.左前下方30° D.右前下方30° utl30) 7.trle.eft(表示相对当前方向( )。 A.顺时针改变30° B.逆时针改变30° C.顺时针改变60° D.逆时针改变60° 8.trl.iooclrtig) uteflclr(oosrn表示( )。 A.绘制图形的边框颜色B.画布颜色 C.画笔颜色D.绘制图形的填充颜色 9.trl.ooooclrlr uteclr(clr1,oo2)中的coo1表示( )。 A.画笔颜色B.填充颜色C.画布颜色D.文字颜色 uteclr(oo1,oo2) oo2表示( )。 10.trl.ooclrclr中的clr A.画笔颜色B.填充颜色C.画布颜色D.文字颜色 三、填空题 1.画布尺寸设置函数是。 2.画笔抬起函数是。 3.画笔尺寸设置函数是。 4.画笔前进函数是。 5.绝对角度设置函数是。 6.画布的角度坐标系以为原点。 7.画布内部的距离单位是。 8.隐藏画笔的turtle形状函数是。 9.显示画笔的turtle形状函数是。 10.画圆命令是。 四、编程题 1.编写程序绘制太极图,如图5-10所示。 2.编写程序绘制爱心祝福图形,如图5-11所示。 图5-10 太极图图5-11 爱心祝福图形 ·68· 3. 编程绘制正弦函数和余弦函数,要求定义两支画笔同时绘制,设置画布为(800, 400), 起点为(-300,0), 单边高度为100 像素,如图5-12 所示。 图5-12 绘制三角函数 ·69·