赞
踩
turtle 是海龟绘图模块,海龟绘图很适合用来引导孩子学习编程,最初构想来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言,它是基于tkinter 模块打造,提供简单的绘图方法。
turtle模块假定在绘图区有一只机器海龟,起始位置在 x-y 平面的 (0, 0) 点,通过组合使用前进、旋转等命令,在平面坐标系中移动,爬行的路径将绘制图形,这样就可以轻松地绘制出精美的形状和图案。turtle的绘图区使用平面坐标系,如下图所示:
先从画简单的线段开始讲解,假设有这样的程序:先执行 import turtle,再执行 turtle.forward(95),它将(在屏幕上)朝所面对的 x 轴正方向前进 95 像素,随着它的移动画出一条线段;然后再执行 turtle.right(25),它将原地右转 25 度。程序如代码2-7-1.py所示:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-1.py
import turtle
turtle.forward(95)
turtle.right(25)
print('按回车键退出')
input()
程序执行结果如下:
上面程序用到了turtle模块的以下几个方法:
1、turtle.forward(distance)
海龟前进 distance 指定的距离,方向为海龟的朝向。该方法也可以写成如下格式:
turtle.fd(distance)
其中,distance为数值 (整型或浮点型)
下面代码演示了该方法的使用。
>>> turtle.position()
(0.00,0.00)
>>> turtle.forward(25)
>>> turtle.position()
(25.00,0.00)
>>> turtle.forward(-75)
>>> turtle.position()
(-50.00,0.00)
上面代码执行过程如下:
1、turtle.position()输出当前位置(0,0)。
2、turtle.forward(25)前进25,那么就是向x轴正方向移动25,然后,turtle.position()输出当前位置(25,0)。
3、turtle.forward(-75)前进-75,就是倒退75,向x轴负方向移动75,然后,turtle.position()输出当前位置(-50.00,0.00)。
代码2-7-2.py将当前画笔颜色和填充颜色分别设为绿色Green和黄色yellow,然后,向前进105像素。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-2.py
import turtle
turtle.color('Green','yellow')
turtle.forward(105)
print('按回车键退出')
input()
程序执行结果如下:
程序2-7-2.py使用turtle.color设置颜色,调用格式如下:
turtle.color(*args)
返回或设置画笔颜色和填充颜色,其中args为参数元组,可包括0-3个参数。
> 提示:Python的函数可以处理不同数量的参数,参数数量可变化,这种参数称为可变参数,使用“*”(元组)或“**”(字典)作为前缀。比如:“*args”前面的“*”表示参数以元组的形式存储在
> arg中;“**kwargs”前面的“**”表示参数以字典的形式存储在 kwargs中。
turtle.color可如下使用 0 -3 个参数:
1、无参数,格式如下:
color()
返回以当前画笔颜色和填充颜色的一对颜色(用字符串或元组表示),两者可分别由 pencolor() 和 fillcolor() 返回。
2、设置颜色,格式如下:
(1)color(colorstring)
设置画笔颜色为 colorstring 指定的 Tk 颜色描述字符串,例如 “red”、“yellow” 。
(2)color((r,g,b))或color(r,g,b)
设置画笔颜色为以 r, g, b 元组表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode,colormode 的值为 1.0 或 255 。
(3)color(colorstring1, colorstring2)
设置画笔颜色和填充颜色为指定的值。colorstring1表示画笔颜色,而 colorstring2表示填充颜色。
(4)color((r1,g1,b1), (r2,g2,b2))
设置画笔颜色和填充颜色为指定的值。第一个参数(r1,g1,b1)表示画笔颜色,第二个参数(r2,g2,b2)表示填充颜色。
1、左转
使用left函数完成海龟左转 angle 个单位。具体格式如下:
turtle.left(angle)或turtle.lt(angle)
其中,参数angle为一个数值(整型或浮点型),表示海龟左转 angle 个单位(单位默认为角度)
此外,还有如下2个函数经常和转向搭配使用:
(1)turtle.heading(),该函数返回海龟当前的朝向。
(2)turtle.home(),该函数将海龟移至初始坐标 (0,0),并设置朝向为初始方向。
下面举几个例子讲解:
(1)下面代码首先通过turtle.heading()返回当前朝向角度为22度;然后,再通过turtle.left(45)左转45度;最后,通过 turtle.heading()返回朝向角度22+45=67度。
>>> turtle.heading()
22.0
>>> turtle.left(45)
>>> turtle.heading()
67.0
(2)下面代码段首先通过turtle.heading()返回当前朝向角度为90度,并通过turtle.position()返回当前位置为(0.00,-10.00);然后,通过turtle.home()将位置和初始方向进行初始化,并返回初始化后的位置和角度;接着,通过turtle.fd(60)前进60,并返回当前角度为0度,位置为(60.00,-0.00);最后,通过turtle.lt(25) 左转25度,并通过turtle.position()返回当前位置(60.00,-0.00),通过turtle.heading()返回当前角度为25度。
>>>turtle.heading()
90.0
>>> turtle.position()
(0.00,-10.00)
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
>>>turtle.fd(60)
>>>turtle.heading()
0.0
>>>turtle.position()
(60.00,-0.00)
>>>turtle.lt(25)
>>>turtle.position()
(60.00,-0.00)
>>>turtle.heading()
25.0
2、右转
使用right函数完成海龟右转 angle 个单位。具体格式如下:
(1)turtle.right(angle)
(2)turtle.rt(angle)
其中,参数angle为一个数值(整型或浮点型),表示海龟左转 angle 个单位(单位默认为角度)。
下面代码先返回当前朝向角度为22度,再右转45度,最后返回当前朝向角度为22+360-45=337度。
>>> turtle.heading()
22.0
>>> turtle.right(45)
>>> turtle.heading()
337.0
程序2-7-4.py使用海龟在屏幕上画一个正方形,画笔颜色为绿色,填充颜色为黄色。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-4.py
import turtle
turtle.color('Green','yellow')
turtle.forward(75)
turtle.left(90)
turtle.forward(75)
turtle.left(90)
turtle.forward(75)
turtle.left(90)
turtle.forward(75)
print('按回车键退出')
input()
程序2-7-4首先通过turtle.color(‘Green’,‘yellow’)设定画笔颜色和填充颜色;然后,依次执行4次动作序列:forward前进、left左转
程序运行结果如下:
turtle.circle函数完成画圆或圆弧功能,其调用格式如下:
turtle.circle(radius, extent=None, steps=None)
该函数的3个参数含义如下:
radius – 数值,指定半径。圆心在海龟左边 radius 个单位, radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。
extent – 数值 (或 None), 为一个夹角,用来决定绘制圆的一部分。未指定 extent则绘制整个圆,如果 extent 不是完整圆周,则以当前画笔位置为一个端点绘制圆弧。
steps – 整型数 (或 None),内切正多边形边的数量。圆实际是以其内切正多边形来近似表示的,其边的数量由 steps 指定。如果未指定边数则会自动确定。此方法也可用来绘制正多边形。
程序2-7-5-1.py绘制。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-5-1.py
import turtle
turtle.home()
turtle.bk(300)
turtle.home()
turtle.fd(300)
turtle.home()
turtle.lt(90)
turtle.fd(300)
turtle.home()
turtle.rt(90)
turtle.fd(300)
turtle.home()
turtle.color('green')
turtle.circle(120)
turtle.home()
turtle.color('red')
turtle.circle(-60)
turtle.up()
turtle.color('blue')
turtle.goto(0,-120)
turtle.down()
turtle.circle(120)
print('按回车键退出')
input()
程序运行结果如下:
程序2-7-5-1.py中除了turtle.circle函数,还使用了以下几个函数:
1、turtle.back函数
该函数完成后退功能,方向与海龟的朝向相反。不改变海龟的朝向。调用格式如下:
(1)turtle.back(distance)
(2)turtle.bk(distance)
(3)turtle.backward(distance)
其中,参数distance为数值,表示海龟后退 distance 指定的距离。
函数使用方法如下面代码所示:
>>> turtle.position()
(0.00,0.00)
>>> turtle.backward(10)
>>> turtle.position()
(-10.00,0.00)
2、turtle.up函数
该函数表示画笔抬起,即:移动时不画线。调用格式如下:
(1)turtle.penup()
(2)turtle.pu()
(3)turtle.up()
3、turtle.down函数
该函数表示画笔落下,即:移动时将画线。调用格式如下:
(1)turtle.pendown()
(2)turtle.pd()
(3)turtle.down()
4、turtle.goto函数
该函数将海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。调用格式如下:
(1)turtle.goto(x, y=None)
(2)turtle.setpos(x, y=None)
(3)turtle.setposition(x, y=None)
其中,参数x为数值或数值对/向量,y 为数值或 None。如果 y 为 None,x 应为一个表示坐标的数值对或 Vec2D 类对象 (例如 pos() 返回的对象),否则x和y分别为坐标(x,y)的x和y的值。
函数使用方法如下面代码所示:
>>> nowPos = turtle.pos()
>>> nowPos
(0.00,0.00)
>>> turtle.setpos(10,90)
>>> turtle.pos()
(10.00,90.00)
>>> turtle.setpos((28,10))
>>> turtle.pos()
(28.00,10.00)
>>> turtle.setpos(nowPos)
>>> turtle.pos()
(0.00,0.00)
程序2-7-5-1.py执行过程如下:
1、通过先调用home()回到原点,然后再通过bk和fd函数移动的方式,依次绘制x轴的正方向和负方向。代码片断如下:
turtle.home()
turtle.bk(300)
turtle.home()
turtle.fd(300)
2、通过先调用home()回到原点,然后再通过color函数设置绘制颜色为绿色,最后,绘制一个半径为120的圆,但圆心不在原点处,海龟从原点开始向逆时钟向上画圆(半径为正数表示逆时钟绘制),圆心在(0,120)处。圆的底部与x轴交于原点。代码片断如下:
turtle.home()
turtle.color(‘green’)
turtle.circle(120)
3、通过先调用home()回到原点,然后再通过color函数设置绘制颜色为红色,最后,绘制一个半径为60的圆,但圆心不在原点处,海龟从原点开始向顺时钟向下画圆(半径为负数表示顺时钟绘制),圆心在(0,-60)处。圆的顶部与x轴交于原点。代码片断如下:
turtle.home()
turtle.color(‘red’)
turtle.circle(-60)
4、通过先调用up函数抬起画笔,以便下一步移动不画线,然后再通过color函数设置绘制颜色为蓝色,接着,海龟移动到(0,-120),落下画笔,最后,从(0,-120)出发,绘制一个半径为120的圆,圆心在原点处,开始向逆时钟向上画圆(半径为正数表示逆时钟绘制)。圆的顶部与x轴交于原点。代码片断如下:
turtle.up()
turtle.color(‘blue’)
turtle.goto(0,-120)
turtle.down()
turtle.circle(120)
本例需要用到以下几个函数。
1、turtle.pensize函数
设置线条的粗细为 width 或返回该值。调用格式如下:
(1)turtle.pensize(width=None)
(2)turtle.width(width=None)
其中,参数width 为正数值。如果 resizemode 设为 “auto” 并且 turtleshape 为多边形,该多边形也以同样组细的线条绘制。如未指定参数,则返回当前的 pensize。具体方法见下面代码:
>>> turtle.pensize()
1
>>> turtle.pensize(8) # 从下面代码开始用宽度为8的线进行绘制。
....
.....
>>> turtle.pensize(1) # 从下面代码恢复宽度初始值,即:用宽度为1的线进行绘制。
2、turtle.color函数
前面已经介绍过,但本例中参数为r、g、b,它们分别是RGB 颜色的分量。RGB色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
3、screen.colormode函数
返回颜色模式或将其设为 1.0 或 255。构成颜色三元组的 r, g, b 数值必须在 0…cmode 范围之内。调用格式如下:
turtle.colormode(cmode=None)
参数cmode为数值 1.0 或 255 之一,下面代码演示了其使用方法:
>>> screen.colormode(1)
>>> turtle.pencolor(240, 160, 80)#程序报错,参数数值超过1。
Traceback (most recent call last):
...
TurtleGraphicsError: bad color sequence: (240, 160, 80)
>>> screen.colormode()#恢复参数数值上限为1。
1.0
>>> screen.colormode(255)#设置参数数值上限为255
>>> screen.colormode()#返回参数数值上限
255
>>> turtle.pencolor(240,160,80)#设置颜色R、G、B的值分别为240、160、80。
程序2-7-6.py通过颜色的RGB值依次递增16,在屏幕上逐行绘制渐变条。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-6.py
import turtle
ts = turtle.getscreen()
ts.colormode(255)
turtle.up()
turtle.goto(-300,-300)
turtle.down()
posX,posY=turtle.position()
turtle.pensize(2)
for r in range(0,256,16):
for g in range(0,256,16):
for b in range(0,256,16):
turtle.color(r,g,b)
turtle.fd(6)
posY+=2
posX=-300
turtle.up()
turtle.goto(posX,posY)
turtle.down()
ts.colormode(1)
print('按回车键退出')
input()
程序2-7-6.py的执行过程依次为:
1、通过 turtle.getscreen()取得屏幕对象screen,然后通过ts.colormode(255)设置颜色上限范围。
2、通过turtle.up()提起画笔,然后通过turtle.goto(-300,-300)移动到(-300,-300)处,再通过turtle.down()落下画笔。
3、通过posX,posY=turtle.position()取得海龟位置,再通过turtle.pensize(2)设置画笔线条的粗细。
4、通过下面代码段绘制渐变条,通过R、G、B三色依次从0递增到256,每次递增16。在绘制过程中,b值完成循环递增后,在上方重新定义海龟位置,将x值设为-300,将y值增加2,并移动到新位置,再继续循环绘制。
for r in range(0,256,16):
for g in range(0,256,16):
for b in range(0,256,16):
turtle.color(r,g,b)
turtle.fd(6)
posY+=2
posX=-300
turtle.up()
turtle.goto(posX,posY)
turtle.down()
5、通过ts.colormode(1)重新设置颜色范围上限为1。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。