如果你认为Python 智能做那些冰冷冷的数据处理,那你就错了,Python 也可以做很多有趣的事情,比如同学们最喜欢的画画,Python 也非常“擅长”,它甚至可以绘制出一幅与众不同的画作。那Python 陛下的画作是什么样的呢?
让我们拭目以待吧!
海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。
turtle 模块提供 面向对象 和 面向过程 2种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。
turtle(海龟)是Python内置的一个标准模块,它提供了绘制线、圆以及其它形状的函数,使用该模块可以创建图形窗口,在图形窗口中通过简单重复动作直观地绘制界面与图形。
turtle的使用主要分为以下三个方面:
- 创建窗口
- 设置画布
- 绘制图形
- 海龟运动
- 画笔控制
- 海龟状态
- 使用事件
- 特殊海龟方法
- … Screen 方法…
- 窗口控制
- 动画控制
- 使用屏幕事件
- 设置与特殊方法
- 输入方法
- Screen 专有方法
1. turtle 的坐标系
turtle 坐标系有两个:一个是 (窗口)画布 在整个计算机屏幕中的坐标系,另外一个是 画笔 在整个(窗口)画布中的坐标系。
1.1 画布在屏幕中的坐标系
画布在计算机屏幕中的坐标系如下:
画布的(0,0) 坐标位于屏幕的左上方。 做小单位为像素。 setup()函数设置画布大小及位置,格式为:
turtle.setup(width, height, startx=None, starty=None)
参数功能如下:
参数使用小提示:
-
setup()函数不是必须的,只有当需要改变画布大小或者坐标位置的时候使用;如果没有setup()函数,直接用turtle 进行绘图,画布默认的尺寸为800像素 * 600 像素, 并且位于计算机屏幕的中央。 -
setup()的4个参数,可以没有坐标信息,甚至可以连4个参数都没有。如果4个参数没有,则按照默认尺寸和位置进行设置; -
setup()前2个参数可以使用小于等于1.0的小数表示,代表的是画布的大小占整个计算机屏幕尺寸的比例。 比如 turtle.setup(1.0, 1.0) 代表的是按照屏幕尺寸(宽和高)100%的比例进行设置,turtle.setup(0.5, 0.5) 代表的是按照计算机屏幕尺寸的 50%比例缩小画布。
import turtle
turtle.setup(800,600)
turtle.done()
1.2 画笔在画布中的坐标系
画笔在画布中的坐标系和画布在屏幕中的坐标系是不一样的,最大的不同是画布的正中是坐标系的原点(0,0),如下所示:
让小海龟走到指定的坐标,对应的命令是:turdle.goto(x,y) ,坐标的单位为像素。
易错点
- (1)两个坐标系的原点位置不同,要注意在设置哪个坐标系。
- (2)setup() 不是必需 的,默认画布尺寸为800像素 * 600像素,而并非400像素 * 300像素。
2. turtle 的画笔的体系
2.1 画笔的命名
在turtle 中可以有多支画笔, 但是每一支画笔都必须要有自己独有的名字,如果只有一支画笔,则不需要命名。
画笔命名函数:turtle.Pen() ; 格式为 pen1 = turtle.Pen() , 前面的pen1 为画笔的名称。命名画笔后,该画笔的所有函数均需要在前面加上画笔名称,不能在使用默认的turtle 前缀。
2.2 画笔设置函数
turtle.pensize(a)函数
turtle.width(width=None)
作用:设置画笔的粗细
参数 :width – 一个正数值, 代表画笔的像素数量
设置线条的粗细为 width 或返回该值。如果 resizemode 设为 “auto” 并且 turtleshape 为多边形,该多边形也以同样组细的线条绘制。如未指定参数,则返回当前的 pensize。
turtle.penup()函数
作用:画笔抬起 – 移动时不画线。
特别说明:抬笔后,画笔的所有操作和移动都不会在画布上留下痕迹。
注意:turtle模块中为penup()和pendown()函数定义了别名,penup() 函数的别名为pu() ; pendown() 函数的别名为pd() 。
turtle.pendown()函数
作用:画笔落下 – 移动时将画线。
特别说明:画笔落下后,才能绘制图形。
turtle.hideturtle()
作用:隐藏小海龟,表示不显示小海龟
特别说明:隐藏并不影响小海龟绘图,即隐藏后小海龟还是可以绘图的。
turtle.showturtle()
作用: 显示小海龟
turtle.shape()和turtle.Turtle()
turtle.shape(name=None)
作用:设置小海龟的形状
参数 :name – 一个有效的形状名字符串。
设置海龟形状为 name 指定的形状名,如未指定形状名则返回当前的形状名。name 指定的形状名应存在于 TurtleScreen 的 shape 字典中。多边形的形状初始时有以下几种: “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”。
特别说明:默认小海龟的形状为“classic” ;参数作为字符串,所以必须加上引号,例如:turtle.shape("turtle")
write() 函数
turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal'))
作用:在小海龟当前位置书写文字
参数:
- arg – 要书写到 TurtleScreen 的对象
- move – True/False
- align – 字符串 “left”, “center” 或 “right”
- font – 一个三元组 (fontname, fontsize, fonttype)
基于 align (“left”, “center” 或 “right”) 并使用给定的字体将文本 —— arg 的字符串表示形式 —— 写到当前海龟位置。 如果 move 为真值,画笔会移至文本的右下角。 默认情况下 move 为 False。
from turtle import *
import turtle
turtle.setup(800, 600)
turtle.bgcolor("white")
turtle.write("Home = ", True, align="center")
turtle.write((0, 0), True)
turtle.done()
效果如下:
2.3 颜色相关的设置(画布、画笔、图形填充)
turtle.pencolor(color)
作用:设置画笔的颜色
参数 color 有两种表示方式。
- pencolor(colorstring) — 字符串形式,内容为颜色的英文,字母用小写,如“red”、“green”、“black”等等。
- pencolor((r, g, b)) — RGB三元组值形式,RGB是工业界的一种颜色标准,数值越大,该颜色越深,如
turtle.pencolor(255, 255, 255) 代表的是白色 ,(0, 0, 0)是黑色。注意:在使用RGM三原色时,需要在程序前面声明 turtle.colorcode(255) 将颜色设置成RGB模式。
turtle.color(color1, color2)
作用:同时设置画笔及填充的颜色。
参数:第一个参数color1代表的是画笔的颜色,第二个参数color2 代表的是填充的颜色。
特别说明:如果只有一个参数,则代表该颜色既是画笔颜色也是填充颜色。参数color1 和 color2 都可以使用RGB表示。
turtle.fillcolor(color)
作用 :设置填充颜色
参数:color 代表是填充颜色。
特别说明:填充颜色需要在开始填充前进行声明才有效。参数可以使用RGM模式表示。
turtle.begin_fill()
作用:设置填充的起点,表示开始填充。
特别说明:开始填充和结束填充必须配对使用。
turtle.end_fill()
作用:设置填充的终点,表示结束填充。
特别说明:结束填充和开始填充必须配对使用。
turtle.bgcolor(color)
作用:设置画布的背景颜色。
特别说明:color 为背景颜色的文本名或RGM数值。
易错点
- (1) 命名多支画笔时必须使用turtle.Pen() ,命名的格式为
a = turtle.Pen() 。这里P 要大写。 - (2) 所有的颜色设置,均可以用字符串和RGB 两种模式,但是在字符串模式下,颜色名称一定要加引号。
- (3) 所有的颜色设置也可以用RGB 值来表示。
- (4) turtle.begin_fill() 函数必须要在开始绘制需要填充的图形前就声明。
- (5)
turtle.Turtle() 命令除了可以设置小海龟的形状外,还可以进行多支画笔的设置。
示例代码:
import turtle
turtle.pensize(5)
turtle.fillcolor("red")
turtle.begin_fill()
turtle.color("yellow")
turtle.circle(50, steps=6)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
输出效果:
3. turtle 的运动体系
3.1 turtle 的相对方向
小海龟(画笔)在画布上是与方向的,默认的小海龟的头部(前方)为屏幕的右侧,尾部(后方)为屏幕的左侧,小海龟的左侧为屏幕的上方。
小海龟(画笔)的方向会随着画笔的方向改变而改变,所以,该方向为相对方向, 以小海龟的头部所朝向的前方为标准简历新的方向体系。
对应的函数有:
turtle.forward(distance) turtle.backward(distance) turtle.circle(radius,extent=None,steps=None) turtle.left(angle) turtle.right(angle)
3.2 turtle 的绝对方向
除了相对于小海龟头部方向的相对方向之外,turtle 还有绝对方向, 其特征如下。
- (1) 绝对方向是不变的;
- (2)绝对方向的划分如图。屏幕的右方为 0°起点,也是360°终点;屏幕的上方为90°(逆时针)/-270°(顺时针);屏幕左侧为180°/-180°;屏幕下方为270° /-90°。
(逆时针:右-上-左-下方向 0°、90°、180°、270°)
对应的函数有:
turtle.setheading(angle) 设置朝向,但不前进
3.3 相关函数
turtle.goto(x, y)
作用:让小海龟直线前进到指定坐标。
参数: (x, y)为目标位置的 x 坐标和y 坐标。
turtle.forward(a)
作用:让小海龟 向前 移动a 个像素。
参数:a 代表的是移动的像素数。
turtle.backward(a)
作用:让小海龟 向后 移动a 个像素。
参数:a 代表的是移动的像素个数。
turtle.left(angle)
作用:让小海龟 向左 转 angle 角度。
参数:angle 代表旋转的角度。
特别说明: 参数为整数,代表 右转;为负数,代表左转。
turtle.circle(radius, extent =None, steps=None)
作用:绘制圆或圆弧
参数:
- radius — 代表的是半径,这个参数必须有;
- extent — 代表的是弧度,如果没有给定参数,默认为360°;
- steps — 代表绘制圆或圆弧所需要的边的数量。
特别说明:
- (1)
turtle.circle() 中的参数,半径参数为必需的给定,弧度和边数参数是可以选择设定。注意:如果确定了变数参数值,则有两种方法表示:turtle.circle(80, 360, 4) 或 turtle.circle(80, steps = 4) 。 - (2)正多边形的绘制:
turtle.circle() 可以绘制正多边形,但是要注意:1.绘制正多边形时,turtle.circle()三个参数要完整,都要给定;2.正多边形的边长并不是半径也不是直径,如果不完整,需要按照语法格式补全参数。
示例程序:
import turtle
turtle.color('red')
turtle.pensize(5)
turtle.circle(100, 360)
turtle.penup()
turtle.goto(200, 0)
turtle.pendown()
turtle.circle(100, 360, 6)
turtle.hideturtle()
turtle.done()
输出效果:
turtle.setheading(angle)
作用:让小海龟转到指定的绝对角度,该函数和前面的 turtle.left(angle)以及turtle.right(angle)最大的不同在于,该函数指转到指定角度,与之前画笔所朝向的方向没有任何关系。
参数:angle 为必需有的参数,代表旋转的绝对角度,参数可以为负数。
特别说明:turtle.setheading()可以简写为 `turtle.seth()。
turtle.speed(a)
作用:设定画笔的运动速度。
参数:a 的数值范围是 0~10 ,数字越大,速度越快,但是最快的是0 而不是10,因为当参数为0 时,turtle 绘图不需要动画。
turtle.dot(size=None, *color)
作用:绘制一个直径为size ,颜色为 color 的圆点。
参数:
- size — 一个整型数 >= 1 (如果指定);若size 未指定,则直径取pensize+4 和 2* pensize中较大值。
- color — 一个颜色字符串或者RGB颜色数值元组
特别说明: a 为圆点的直径,单位为像素。
turtle.home()
作用: 让小海龟返回原点
特别说明: 小海龟返回原点(0, 0)后,方向为初始方向,即屏幕的右方,但是画笔的颜色等设置依然保留。
易错点
-(1)turtle.dot() 的参数为直径,而turtle.circle() 的参数为半径。 -(2)turtle.seth() 的参数为绝对角度,而turtle.left() 和 turtle.right() 的参数为相对角度。 -(3)turtle.speed() 的参数范围为0~10 ,最快的是 0 ,最慢的是1 。
4. 其他函数
turtle.rest()
作用:清空画布,并且重置turtle 状态为初始状态
turtle.clear()
作用:清空turtle 窗口,但是turtle 的位置和状态不会改变。
注意:turtle.rest() 和 turtle.clear() 有着本质的区别:前者是完全初始化,画笔的所有设置均恢复到初始状态,但不包括画布的设置(比如画布的大小、画布的背景颜色等);而后者只轻触画布上的图案,并不改变画笔的设置和位置。
turtle.clone()
作用:创建并返回一个 turtle 的克隆体,该克隆体与 turtle 具有相同的属性。
turtle.stamp()
作用:印章,将小海龟的形状或者绘制的形状作为印章复制到屏幕上,和Scratch中的的印章作用一致。
turtle.screensize(canvwidth, canvheight, bg)
作用:设定画布的尺寸和背景颜色。
参数:一共有3个,前面两个参数设置画布的宽度和高度,第三个参数设定背景颜色。
说明:如果没有参数,则返回当前窗口的宽度和高度。
turtle.mainloop() 和 turtle.done()
作用: 停止画笔绘制,但是窗口不会关闭。由于这是用来停止画笔的,所以必须用在程序的中的最后一个语句。
示例程序:
import turtle
turtle.shape("square")
turtle.home()
turtle.dot()
turtle.stamp()
turtle.forward(100)
turtle.setheading(90)
turtle.stamp()
turtle.forward(100)
turtle.left(90)
turtle.stamp()
turtle.forward(100)
turtle.left(90)
turtle.stamp()
turtle.forward(100)
turtle.done()
输出效果:
练习
绘制下图。
(1)画一个有两个直角三角形组成的正方形,边长为180像素。 (2)左上三角形填充为黄色,右下三角形填充为红色。 (3)设置笔画移动速度为1,线条颜色为黑色。 (4)画图结束,隐藏并停止画笔。
示例程序:
import turtle
turtle.speed(1)
turtle.color('black', 'red')
turtle.begin_fill()
turtle.right(90)
turtle.forward(180)
turtle.right(90)
turtle.forward(180)
turtle.goto(0, 0)
turtle.end_fill()
turtle.color("black", "yellow")
turtle.begin_fill()
turtle.setheading(0)
turtle.backward(180)
turtle.right(90)
turtle.forward(180)
turtle.goto(0, 0)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
输出效果:
参考资料
|