Python 基础绘图库-turtle介绍

  • A+
摘要本文会介绍 Python 的基础图库 Turtle。Turtle 库可以帮助初学者更好的学习 Python。本文会介绍如何控制「海龟」在画布上进行移动与绘画,同时使用 Turtle 制作一个简单的游戏。

简介

Turtle 库是 Python 的基础绘图库。其主要是用于程序设计入门,是标准库之一,利用 turtle 可以制作很多复杂的绘图。总体来说,turtle 库可以帮助初学者对学习 Python 有兴趣。

Turtle 名称含义为「海龟」。我们想象一只海龟,位于显示器上窗体的正中心,在画布上游走,它游走的轨迹就形成了绘制的图形。海龟的运动是由程序控制的,它可以变换颜色,改变大小(宽度)等。

参考资料

 

Turtle 库简单使用

Turtle 是 Python 的一个内建的库,所以我们不需要进行安装。我们唯一需要做的就是将其导入到 Python 环境中。我们可以通过下面的命令来导入 turtle 库。

  1. import turtle

现在 turtle 已经在我们的环境中了。我们可以创建一个单独的窗口,在上面执行绘画的命令。首先我们初始化一个窗口。

  1. s = turtle.getscreen()

接着我们初始化一个变量,这个就是来表示 turtle 的,我们可以控制他的移动。

  1. t = turtle.Turtle()

现在我们已经有了窗口(可以认为是一个画布)和我们的海龟(可以认为是一支画笔)。我们可以使用我们的程序来控制海龟在画布上进行移动。这个海龟会有一些属性是可以改变的,例如大小颜色移动速度等。下面我们就会详细说明如何控制海龟的移动。

 

控制海龟移动的方向

我们首先学习如何控制海龟朝不同的方向进行移动。一共是有四个方向海龟可以移动,分别是:

  • 前(Forward)
  • 后(Backward)
  • 左(Left)
  • 右(Right)

其中 .forward.backward 分别表示表示朝着面向,或是背面的方向移动。里面可以放参数,来控制移动的距离.left.right 表示转向,可以控制转向的角度。我们可以尝试一下下面的例子:

  1. import turtle
  2. s = turtle.getscreen() # 初始化一个 screen
  3. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  4. t.speed(1) # 控制会话速度
  5. t.forward(100)
  6. t.right(90)
  7. t.forward(100)
  8. t.left(90)
  9. t.backward(100)

运行上面代码,我们的海龟会依次执行以下的动作(上面 speed 是控制海龟移动的速度的,这个稍后会有更加详细的介绍):

  1. 向前移动 100 个单位
  2. 右转 90 度
  3. 向前走 100 个单位
  4. 左转 90 度
  5. 前后走 100 个单位

最终会得到如下的效果:

Python 基础绘图库-turtle介绍

上面的左转,右转,直行和后退都是可以化简的,如下所示:

  1. t.rt() instead of t.right()
  2. t.fd() instead of t.forward()
  3. t.lt() instead of t.left()
  4. t.bk() instead of t.backward()

除了按照上面那样移动之外,我们还可以控制海龟直接到达指定的位置。我们可以把整个屏幕想象成一个二维坐标系,起始点就是原点,于是每一个点都有了坐标。

Python 基础绘图库-turtle介绍

整个屏幕被分为了四个象限,海龟初始的地方是 (0,0),我们称之为原点,或是 Home。我们可以使用 .goto 将海龟移动到屏幕的任意位置。下面是一个简单的例子。

  1. import turtle
  2. s = turtle.getscreen() # 初始化一个 screen
  3. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  4. t.speed(1) # 控制会话速度
  5. # 直接移动到 (100, 100)
  6. t.goto(100, 100)

我们直接将海龟移动到 (100, 100) 的位置,输入如下所示:

Python 基础绘图库-turtle介绍

我们还可以使用下面的命令直接将海龟移动到起始位置,也就是 Home 的位置。

  1. t.home()

这个代码是与 t.goto(0,0) 是等价的。

 

绘制基础图形

上面我们已经知道了如何移动海龟。接下来我们尝试一下如何绘制出长方形。

  1. import turtle
  2. s = turtle.getscreen() # 初始化一个 screen
  3. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  4. t.speed(1) # 控制会话速度
  5. t.forward(100)
  6. t.right(90)
  7. t.forward(50)
  8. t.right(90)
  9. t.forward(100)
  10. t.right(90)
  11. t.forward(50)

上面的代码输出结果如下所示:

Python 基础绘图库-turtle介绍

可以看到在绘制长方形的时候,每次转向是一样的。于是我们考虑可以通过 for 循环来绘制一个正方形。代码如下所示:

  1. for i in range(4):
  2.     t.forward(100)
  3.     t.right(90)

最终绘制出的结果如下所示:

Python 基础绘图库-turtle介绍

上面我们绘制了一个长方形和一个正方形。可以尝试使用 .goto 的方式来绘制长方形和正方形。同时也可以尝试绘制三角形,或是其他形状。

 

绘制预设图像-圆与点

上面我们介绍了如何绘制类似「矩形」或是「三角形」这样的几何形状。但是假设现在要和我们绘制一个圆,如果要使用上面的方式,是会比较吃力的。所以在 turtle 中预设了一些形状,例如我们可以使用下面的命令来绘制圆,其中参数是控制圆的半径。

  1. t.circle(100)
  2. t.circle(60)

我们绘制了两个半径不同的圆,最终的效果如下所示:

Python 基础绘图库-turtle介绍

我们可以使用 while 循环,来绘制一个嵌套的圆,同时需要注意,当半径为负数时,圆的朝向就是向下的,可以看一下下面的代码:

  1. n = 10
  2. while n<=50:
  3.     t.circle(n)
  4.     t.circle(-n)
  5.     n += 10

最终绘制的结果如下图所示:

Python 基础绘图库-turtle介绍

除了绘制圆之外,我们还可以绘制点。这个是没有绘画过程的,是一瞬间完成的。

  1. t.circle(100)

同样,我们也可以控制里面的参数来控制点的大小。到目前位置,我们了解了如何使用 turtle 来绘制简单的图形。下面我们会介绍如何自定义 turtle,例如自定义背景颜色,自定义画笔的大小等。

 

使用 turtle 显示文字

我们可以使用 write 来让 turtle 显示指定的文字。下面是一个简单的例子,这里 False 控制写字的时候 turtle 是否会移动到最后一笔的位置。

  1. toy_turtle.write("Python Fan", False, align="center", font=("Arial", 16, 'normal', 'bold', 'italic', 'underline'))

一般在写字的时候,我们习惯于把 turtle 给隐藏掉:

  1. toy_turtle.hideturtle()

 

获得 turtle 的位置

当我们控制 turtle 移动之后,我们可以获取他们的位置。通过 turtle.pos() 来获取,如下所示:

Python 基础绘图库-turtle介绍

使用 .pos,可以获取到 x 和 y 的坐标。

 

进一步自定义 Turtle 图像

这里其实可以分为两个部分,第一个部分是对于画布的自定义;第二个部分是对于画笔的自定义。

自定义画布颜色或图像

上面我们默认情况下画布都是白色的,这个颜色我们是可以自定义的。下面是自定义的方式。

  1. turtle.bgcolor("blue")
  2. turtle.bgcolor("red")
  3. turtle.bgcolor("green")
  4. turtle.bgcolor("#00FFFF")

我们也可以是使用指定的图像来作为背景,下面是自定义的方式:

  1. s = turtle.getscreen() # 初始化一个 screen
  2. s.bgpic('turtle_2.gif')

 

修改画布标题

有些时候我们可以修改我们窗口的标题,更加定制化。例如下面我们将窗口标题修改为"My Title Program"。

  1. turtle.title("My Turtle Program")

最终修改的结果如下图所示:

Python 基础绘图库-turtle介绍

 

修改 turtle 的大小

我们还可以增大和减少屏幕上 turtle 的大小。这个大小的改变是不会影响到最终画笔的粗细的,只是影响显示的大小而已。我们使用 .shapesize 来改变大小,主要会有以下的三个参数:

  • Stretch length
  • Stretch width
  • Outline width

我们使用下面的参数来控制画笔的大小:

  1. t.shapesize(1,1,10)

下面展示了不同的参数的效果,可以看到这里是不影响最终绘制线条的粗细的

Python 基础绘图库-turtle介绍

 

修改 turtle 的形状

在默认情况下画笔的形状不是一个 turtle(海龟),而只是一个三角形。但是我们可以将他的形状修改为 turtle 的形状,或是一些其他的形状。Turtle 库一共支持以下的几种形状:

  • Square,正方形
  • Arrow,箭头
  • Circle,圆形
  • Turtle,海龟的形状
  • Triangle,三角形
  • Classic,也是类似于箭头,他默认的形状

我们可以使用以下的命令来修改形状,下面是修改为 turtle:

  1. t.shape('turtle')

最终实际的效果如下所示:

Python 基础绘图库-turtle介绍

除了使用他默认的形状之外,我们还可以自定义形状。如下所示,我们自定义两个形状,并将其拼接在一起。其中第一个是一个箭头,第二个是一个三角形

  1. s = turtle.Shape("compound")
  2. poly1 = ((0,0),(10,-5),(0,10),(-10,-5))
  3. s.addcomponent(poly1, "red", "blue")
  4. poly2 = ((0,0),(10,-5),(-10,-5))
  5. s.addcomponent(poly2, "blue", "red")
  6. turtle.register_shape("myshape", s)
  7. t.shape('myshape')

最终的效果如下所示:

Python 基础绘图库-turtle介绍

我们甚至可以将一个图片,或是动图注册为 shape,下面是一个简单的例子:

 

修改 turtle 的速度

我们还可以自定义 turtle 移动的速度。我们可以加快或是减慢他移动的速度,使用 speed 来进行控制,下面是简单的说明:

  1. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  2. t.speed(1) # 控制移动速度

我们需要注意一下这里速度的对应关系,不是数字越小速度越慢,他有自己的对应关系:

  • 'fastest' :  0
  • 'fast'    :  10
  • 'normal'  :  6
  • 'slow'    :  3
  • 'slowest' :  1

速度快慢与参数的关系如上所示,就是会比较奇怪。

 

改变画笔的粗细

上面是改变了 turtle 的大小,不会改变最终线条的粗细。但是有的时候我们需要增加或是减少绘制的线条的粗细,我们可以使用 .pensize 来改变绘制的粗细。

  1. t.pensize(5) # 控制线条的粗细
  2. t.circle(100)
  3. t.pensize(1)
  4. t.circle(60)

.pensize 中的参数表示线条的粗细。数字越大,线条越粗。上面的代码表示第一个圆使用 5 倍粗细的线条进行绘制,第二个圆使用正常的线条进行绘制。最终的结果如下所示:

Python 基础绘图库-turtle介绍

 

修改 turtle 和绘制线条的颜色

在默认情况下当我们打开画布的时候,turtle 是一个黑色的图像,并且绘制出的线条也是黑色的。但是根据我们的需求,我们可以进行下面两点定制化:

  • 改变 turtle 的颜色,也就是改变他的填充颜色,也可以改变封闭图像里面的颜色       (change the fill color)。
  • 改变线条的颜色,同时改变 turtle 的 outline,可以改变 turtle 走出的线条的颜色。

下面我们来看一下改变颜色的例子,我们进行如下的设置:

  1. t.shapesize(3,3,3)
  2. t.pensize(3) # 改变线的宽度
  3. t.fillcolor('red') # 修改 turtle 的颜色
  4. t.pencolor('green') # 修改 outline 的颜色

最终输出的效果如下所示:

Python 基础绘图库-turtle介绍

我们也可以将上面修改颜色写在一起,如下所示:

  1. t.color('green', 'red')

其中,

  • 第一个颜色是画线的颜色(the first color is for the pen)
  • 第二个颜色是 turtle 的颜色(the second is for the fill)

 

在绘制的图形中进行填充

前面介绍的都是修改线条的颜色。除此之外,我们还可以修改里面填充的颜色。我们使用 .begin_fill 来告诉程序我们准备绘制一个封闭的图像,需要进行颜色的填充。使用 .end_fill 来告诉程序封闭的图像已经创建完毕,现在开始填充他。

在下面的代码中,我们创建了一个正方形,并在里面填充了蓝色,线条颜色为红色。我们还是首先使用 color 来设置颜色:

  1. t.color('red', 'blue')
  2. t.begin_fill()
  3. for i in range(4):
  4.     t.forward(100)
  5.     t.right(90)
  6. t.end_fill()

最终的效果如下所示:

Python 基础绘图库-turtle介绍

 

通过一行代码设置样式

现在假设我们有如下的需求:

  • 设置画笔颜色为紫色(Pen color: purple
  • 设置填充颜色为橘色(Fill color: orange
  • 设置画笔粗细为 10(Pen size: 10
  • 设置画笔速度为 9(Pen speed: 9

如果按照我们上面讲的,我们的代码需要写成下面的样子:

  1. t.pencolor('purple')
  2. t.fillcolor('orange')
  3. t.pensize(10)
  4. t.speed(9)
  5. t.begin_fill()
  6. t.circle(100)
  7. t.end_fill()

最终的生成效果如下所示:

Python 基础绘图库-turtle介绍

但是每次这么写会比较繁琐,我们可以将这些都写在一行里面。代码如下所示:

  1. t.pen(pencolor="purple", fillcolor="orange", pensize=10, speed=9)
  2. t.begin_fill()
  3. t.circle(100)
  4. t.end_fill()

这里最终生成的效果是和上面一样。

 

将画笔抬起与放下

有的时候,我们想要让我们的 turtle 从屏幕上的一个点移动到另外的一个点,但是又先不要绘制任何东西。为了实现这个,我们可以使用 .penup(),这个非常类似与将画笔提起。如果我们想要让我们的 turtle 重新开始绘画,可以使用 .pendown()

下面我们尝试一个简单的例子,让我们的 turtle 移动到 (100, 100) 的位置在开始绘制圆。

  1. t.penup() # 提起画笔
  2. t.goto(100, 100) # 移动到 100,100
  3. t.pendown() # 将笔放下
  4. t.circle(60) # 开始绘制圆

这里最终的效果如下所示:

Python 基础绘图库-turtle介绍

 

克隆 turtle

有的时候我们需要在画布上有多个类似的 turtle。例如一个 turtle 可以表示一种颜色的画笔,画笔定义好了,只需要修改颜色,就可以使用 clone。如果直接想要多个,只需要直接初始化多个 turtle 即可。例如下面所示:

  1. turtle_1 = turtle.Turtle()
  2. turtle_2 = turtle.Turtle()

在下面的代码中,我们初始化了一个 turtle,接着对其进行克隆,并修改他的属性。

  1. import turtle
  2. s = turtle.getscreen() # 初始化一个 screen
  3. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  4. t.pen(pencolor="purple", fillcolor="orange", pensize=10, speed=1)
  5. c = t.clone()
  6. c.pen(pencolor="red", fillcolor="blue", pensize=10, speed=1)
  7. c.circle(60)
  8. t.circle(-60)

最终的效果如下所示,上面的圆是使用克隆的画笔绘制的,下面的圆是使用原始的画笔绘制的。

Python 基础绘图库-turtle介绍

 

删除某一个 turtle 绘制的内容

我们可以删除某一个 turtle 绘制的内容。如下所示:

  1. t = turtle.Turtle()
  2. t.clear()

注意此时只是清除了绘制的内容,而此时 turtle 的位置是不会移动的。如果我们在一个画布中有多个 turtles,那由别的 turtle 绘制的内容是不会消失的。

 

重置某个 turtle

上面的 clear 只可以删除某个 turtle 当先绘制的内容,但是他的位置是不变的。这里我们使用 reset 可以将 turtle 的位置也回到 HOME 的位置,同时所有设置的参数都会变为默认的参数。同样的,这个也是对于某个 turtle 来说的。只能将指定 turtle 进行重置。

下面我们看一个例子,有两个 turtle,我们只重置其中的一个 turtle。

  1. s = turtle.getscreen() # 初始化一个 screen
  2. t = turtle.Turtle() # 初始化一个变量, 表示 turtle
  3. t.pen(pencolor="purple", fillcolor="orange", pensize=10, speed=3)
  4. c = t.clone()
  5. c.pen(pencolor="red", fillcolor="blue", pensize=10, speed=3)
  6. c.circle(60)
  7. t.circle(-60)
  8. t.reset()

最终的效果如下所示,可以看到只有指定的 turtle 的进行了重置。

Python 基础绘图库-turtle介绍

 

Turtle 制作海龟赛跑

我们把前面学到的所有关于 Turtle 的用起来,制作一个海龟赛跑的游戏。游戏主要是两只海龟,每位玩家随机一个数表示海龟移动的距离,最后看谁先移动到终点。

游戏环境设计

我们首先初始化海龟,给出他们的初始化位置(也就是对应的起点)

  1. player_one = turtle.Turtle()
  2. player_one.color("green")
  3. player_one.shape("turtle")
  4. player_one.penup()
  5. player_one.goto(-200,100)
  6. player_two = player_one.clone()
  7. player_two.color("blue")
  8. player_two.penup()
  9. player_two.goto(-200,-100)

上面我们两个 player 是使用了 clone,我们也可以直接定义两个,下面也使用 turtle.Turtle() 将那些初始化。接着我们给出各自对应的重点,终点使用圆来表示。起点和终点距离是 500

  1. player_one.goto(300,60) # 去终点
  2. player_one.pendown()
  3. player_one.circle(40)
  4. player_one.penup()
  5. player_one.goto(-200,100) # 返回起点
  6. player_two.goto(300,-140)
  7. player_two.pendown()
  8. player_two.circle(40)
  9. player_two.penup()
  10. player_two.goto(-200,-100)

在完成了这些之后,我们就可以看到如下的场景:

Python 基础绘图库-turtle介绍

游戏功能设计

在绘制好了上面游戏的环境之后,我们就要设计主体的功能了,主要有以下的内容。

  • 我们需要能够检查海龟是否到达了终点;
  • 如果没有达到终点,需要让玩家继续玩;
  • 在每一步中,会从 1-6 中随机选择一个数字,代表移动的距离;
  1. while (player_one.pos()[0] < 260) and (player_two.pos()[0] < 260): # 游戏结束的条件
  2.     # player one 移动
  3.     screen.textinput("随机数", "Player One:")
  4.     random_num = random.randint(1, 6)
  5.     player_one.forward(random_num * 20)
  6.     if player_one.pos()[0] >= 260:
  7.         print('1') # 判断输赢
  8.         break
  9.     # player two 移动
  10.     screen.textinput("随机数", "Player Two:")
  11.     random_num = random.randint(1, 6)
  12.     player_two.forward(random_num * 20)
  13.     if player_two.pos()[0] >= 260:
  14.         print('2') # 判断输赢
  15.         break

上面是简单实现的操作的功能,最终的效果如下所示:

Python 基础绘图库-turtle介绍

这个还是可以继续完善的,首先可以有一个随机数,决定谁先开始。其次可以制作一个显示比分的内容。然后可以有每次谁移动的,移动了多少的提示。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: