目录

  • 1. 设置画笔样式
    • 1.1 画笔初始形状
    • 1.2 设置画笔颜色
    • 1.3 落笔与抬笔
    • 1.4 设置线条粗细
    • 1.5 隐藏与显示海龟光标
    • 1.6 设置画笔的速度

最近博主在 CSDN 上看到许多关于海龟画图的案例,如画圣诞树、五角星等,但是都是直接给出了源码以及一些简单的注释,没有对其详细的说明,会让很多初学者迷糊很久,故这里博主详细地对 turtle 模块中的方法进行详解,让广大博友能够做到自由画图。

海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle。它最初源于 20世纪60年代 的 Logo 语言,之后成为了 Python 的内置模块。海龟绘图提供了一些简单的绘图方法,可以根据编写的控制指令(代码),让一个 “海龟” 在屏幕上来回移动,而且可以在它爬行的路径上绘制图形。通过海龟绘图,不仅可以在屏幕上绘制图形,还可以看到整个绘制过程。另外,海龟绘图对初学者十分友好,它能够轻松地编写出很多有趣的实例。

1. 设置画笔样式

在窗口中,坐标原点(0,0) 的位置默认有一个指向 x 轴正方向的箭头(或小乌龟),这就相当于我们的画笔。在海龟绘图中,通过画笔可以控制线条的粗细、颜色、运动的速度以及是否显示光标等样式。下面分别进行介绍。

1.1 画笔初始形状

在海龟绘图中,默认的画笔形状为箭头,可以通过 shape() 方法修改为其他样式。shape() 方法的语法如下:

def shape(self, name=None)

其中,name 参数为可选参数,用于指定形状名,如没有指定形状名,则返回当前的形状名。常用的形状名有 arrow(向右的等腰三角形)、turtle(海龟)、circle(实心圆)、square(实心正方形)、triangle(向右的正三角形) 或 classic(箭头)等 6 种,如下图所示:

画笔的样式设置后,如果不改变为其他状态,那么会一直有效。例如,先获取当前的画笔形状,然后将画笔形状修改为实心圆,再获取画笔的形状,代码如下:

# -*- coding: UTF-8 -*-
""" @author:AmoXiang @file:3.设置画笔样式.py @time:2020/12/29 """

from turtle import *  # 导入turtle的全部定义

print(f"修改前: {shape()}")  # 获取当前的画笔形状
shape(name="circle")  # 设置当前的画笔形状为实心圆
print(f"修改后: {shape()}")  # 获取修改后的画笔形状
done()  # 海龟绘图程序的结束语句(开始主程序)

程序运行结果如下:

在海龟绘图中,一个画笔形状会跟随海龟的光标移动。如果想要在海龟移动过的某个位置留下一个海龟形状,可以使用 stamp() 方法在当前光标处印制一个印章,该印章不会跟随海龟光标移动。例如,想要在当前光标位置印制一枚印章,可以使用下面的代码:

t = Pen()
stampid = t.stamp()

1.2 设置画笔颜色

在海龟绘图中,画笔的默认颜色为黑色,可以使用 pencolor() 或者 color() 方法修改画笔的颜色。下面分别进行介绍。

  1. pencolor() 方法:用于修改画笔的颜色,同时画笔形状会添加一圈所指定颜色的描述,但是内部还是默认的黑色。pencolor() 方法的语法如下:

    def pencolor(self, *args)
    

    args 参数为可变参数,可以是一个颜色字符串 (可以使用英文颜色或者十六进制颜色值,常用的颜色字符串如下图所示),也可以是三个取值范围在 0~cmode 之间的数值 (如 1.0,0.5,0.5,分别代表 r,g,b 的值),还可以是一个取值范围相同的包括 3 个数值元素 (取值范围在 0-~cmode) 的元组 (如(1.0,0.5,0.5),分别代表 r,g,b 的值)。关于颜色的具体取值请参见 全网最细海龟 (turtle) 画图讲解 (二):窗口控制 一文中的 1.3 设置窗口的背景颜色 小节。例如,使用 pencolor() 方法设置画笔颜色为红色,并且让海龟向前移动 100 像素,可以使用下面的代码:

    # -*- coding: UTF-8 -*-
    """ @author:AmoXiang @file:3.设置画笔样式.py @time:2020/12/29 """
    
    import turtle  # 导入海龟绘图模块
    
    # turtle.pencolor("red")
    # turtle.pencolor(1, 0, 0)
    turtle.colormode(255)  # 设置颜色模式
    turtle.pencolor(255, 0, 0)
    turtle.forward(100)
    turtle.done()  # 海龟绘图程序的结束语句(开始主程序) 
    

    程序运行结果如下:

  2. color() 方法:用于获取或修改画笔的颜色,整个画笔的形状均为所设置的颜色。color() 方法的语法如下:

    def color(self, *args)
    

    args 参数值可以设置为与 pencolor() 方法的完全相同,这里将不再赘述。也可以设置两种颜色,分别用于指定轮廓颜色和填充颜色。例如,turtle.color("red", "yellow") 表示轮廓颜色为红色,填充颜色为黄色。例如,使用 color() 方法设置画笔颜色为红色,并且让海龟向前移动 100 像素,可以使用下面的代码:

    import turtle  # 导入海龟绘图模块
    
    turtle.color("red")
    turtle.forward(100)
    turtle.done()  # 海龟绘图程序的结束语句(开始主程序)
    

    程序运行结果如下:

1.3 落笔与抬笔

本小节我们先来画两条不同颜色的平行线。要实现该功能需要进行以下几步的操作:
设置画笔颜色 ⇒ 绘制第一条直线 ⇒ 向左旋转90° ⇒ 移动一段距离 ⇒ 再向左旋转90° ⇒ 设置画笔颜色 ⇒ 绘制第二条直线。
根据以上分析编写的代码如下:

import turtle  # 导入海龟绘图模块

turtle.color("red")
turtle.forward(200)  # 画一条红色的线
turtle.left(90)
turtle.forward(30)  # 画一条红色的线
turtle.left(90)
turtle.color("green")
turtle.forward(200)  # 画一条绿色的线
turtle.done()  # 海龟绘图程序的结束语句(开始主程序)

程序运行结果如下:

从上图可以看出,并没实现想要的绘制两条平行线。这是因为在移动海龟时,默认会留下“足迹”。如果有时只想实现移动,而不想画线,那么需要设置画笔的抬起(简称抬笔)和落下(简称落笔)的状态。当抬笔时不画线,落笔时再画线。实现抬笔功能时,可以使用下面 3 种方法:

  1. turtle.penup()
  2. turtle.pu()
  3. turtle.up()

这三种方法的功能是一样的,使用哪种方法都可以。实现落笔功能时,可以使用下面 3 种方法:

  1. turtle.pendown()
  2. turtle.pd()
  3. turtle.down() 同理,这三种方法功能都是一样的,使用哪种方法都可以。

首先导入海龟绘图模块,并且画一条红线,然后逆时针旋转 90 度,并且设置抬笔,再移动 30 像素,并且逆时针旋转 90 度,最后设置落笔,并且画一条绿色的线,代码如下:

import turtle  # 导入海龟绘图模块

turtle.color("red")
turtle.forward(200)  # 画一条红色的线
turtle.left(90)
turtle.penup()
turtle.forward(30)  # 向上移动30像素
turtle.left(90)
turtle.pendown()
turtle.color("green")
turtle.forward(200)  # 画一条绿色的线
turtle.done()  # 海龟绘图程序的结束语句(开始主程序)

程序运行结果如下:

海龟绘图还提供了判断画笔是否落下的 turtle.isdown() 方法,当画笔落下时该方法返回 True,抬起时返回 False。例如,想要实现当画笔状态为落笔状态时设置为抬笔,可以使用下面的代码:

if turtle.isdown():
    turtle.penup()  # 抬笔

1.4 设置线条粗细

在海龟绘图中,默认的线条粗细为 1 像素。如果想改变线条粗细,可以通过以下两个方法中的任意一个实现:

turtle.pensize(width=None)
turtle.width(width=None)

其中,width 为可选参数,如果不指定,则获取当前画笔的粗细,否则使用设置的值改变画笔的粗细。例如,修改上面的实例,将第二条绿色的线的粗细设置 5 像素。修改后的代码如下:

import turtle  # 导入海龟绘图模块

turtle.color("red")
turtle.forward(200)  # 画一条红色的线
turtle.left(90)
turtle.penup()  # 抬笔
turtle.forward(30)  # 向上移动30像素
turtle.left(90)
turtle.pendown()  # 落笔
turtle.width(5)  # 设置线的粗细为5像素
turtle.color("green")
turtle.forward(200)  # 画一条绿色的线
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

修改后的程序运行效果如下图所示:

从上图中可以看出,设置线的粗细后,海龟的光标还是原来的大小,如果想要改变其大小,可以在设置线的粗细之前使用代码 turtle.resizemode("auto") 设置改变模式为自动。修改后的代码运行效果如下图所示。

1.5 隐藏与显示海龟光标

在默认情况下采用海龟绘图时,会显示海龟光标。例如,已经通过 shape() 方法将当前的光标样式设置为 turtle(海龟)。那么在绘图时,可以看见屏幕上有一只缓慢爬行的小海龟。对于此种情况,在绘制复杂图形时,势必会影响速度。因此,海龟绘图提供了以下隐藏或显示海龟光标的方法。

  1. showturtle() 或者 st() 方法:用于显示海龟光标。这两种方法任选其一即可。
  2. hideturtle() 或者 ht() 方法:用于隐藏海龟光标。这两种方法任选其一即可。
  3. isvisible() 方法:用于判断海龟光标是否可见。

例如,在默认情况下,让海龟向前爬行 100 像素,再隐藏海龟光标,并且让海龟向下爬行 100 像素,代码如下:

import turtle  # 导入海龟绘图模块

turtle.shape("turtle")  # 改变海龟光标的形状为海龟
turtle.forward(100)  # 向前爬行100像素
turtle.right(90)  # 顺时针旋转90度
turtle.hideturtle()  # 隐藏海龟光标
turtle.forward(100)  # 向下爬行100像素
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

程序运行结果如下:

1.6 设置画笔的速度

在海龟绘图时,默认是有绘制的动画效果的,并且速度的快慢可以通过 speed() 方法进行调整。speed() 方法的语法如下:

def speed(self, s=0):

其中,参数 speed 为可选参数,如果不指定,则获取当前的画笔速度。如果指定,需要将值设置为 0~10 之间的整数或速度字符串。速度字符串有 fastest (最快)、fast (快)、normal (正常)、slow (慢)、slowest (最慢)。当设置速度值时,0表示最快,1表示最慢,然后逐渐加快。

注意:speed=0 表示没有动画效果。forward()/back() 方法将使海龟向前 / 向后跳跃,同样的 left()/right() 方法将使海龟立即改变朝向。

例如,将画笔的速度设置为最快,代码如下:

turtle.speed(0)  # 设置画笔的速度,0为最快

将画笔的速度设置为正常,代码如下:

turtle.speed(6)  # 设置画笔的速度,6为正常

本文地址:https://blog.csdn.net/xw1680/article/details/111938825