1.问题描述
使用Python的turtle(海龟绘图)模块提供的函数绘制直线。
2.问题分析
一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四
边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行
四边形又可以由直线组成,而直线又是由两个点确定的。
我们使用Python的turtle模块所提供的函数来绘制直线。在使用之
前我们先介绍一下turtle模块的相关知识点。
turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组
件。面向对象的接口类如下:
1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的
构造器需要一个tkinter.Canvas或ScrolledCanvas作为参数。应在turtle作
为某个程序的一部分时使用。
Screen()函数返回一个TurtleScreen子类的单例对象。该函数在
turtle作为独立绘图工具时使用。作为一个单例对象,其所属的类是不
可以被继承的。
TurtleScreen/Screen的所有方法还存在对应的函数,即作为面向过
程的接口组成部分。
2)RawTurtle类:定义海龟对象在TurtleScreen上绘图。它的构造
器需要一个Canvas、ScrolledCanvas或TurtleScreen作为参数,以指定
RawTurtle对象在哪里绘图。从RawTurtle派生出子类Turtle,该类对象
在Screen实例上绘图,如果实例不存在,则会自动创建。
下面分类介绍常用的turtle方法。
(1)海龟动作
首先介绍常用的移动和绘制相关的方法。
·turtle.forward(distance):参数distance是一个整型或浮点型数值,
该方法用于设置画笔前进distance指定的距离,方向为画笔的朝向,可
简写为turtle.fd(distance)。
·turtle.backward(distance):参数distance是一个整型或浮点型数
值,该方法用于设置画笔后退distance指定的距离,方向与画笔的朝向
相反,可简写为turtle.bk(distance)或turtle.back(distance)。
·turtle.right(angle):参数angle是一个整型或浮点型数值,该方法
用于设置画笔右转angle个单位,单位默认为角度,可简写为
turtle.rt(angle)。
·turtle.left(angle):参数angle是一个整型或浮点型数值,该方法用
于设置画笔左转angle个单位,单位默认为角度,可简写为
turtle.lt(angle)。
·turtle.goto(x,y=None)|setpos(x,y=None)|setposition(x,y=None):参
数x是一个数值或数值对/向量,而参数y是一个数值或None,该方法用
于设置画笔移动到一个绝对坐标,如果画笔已落下将会画线,它不会
改变海龟的朝向。
·turtle.setx(x):参数x是一个整型或浮点型数值,该方法用于设置
海龟的横坐标为x,纵坐标保持不变。
·turtle.sety(y):参数y是一个整型或浮点型数值,该方法用于设置
海龟的纵坐标为y,横坐标保持不变。
·turtle.setheading(to_angle):参数to_angle是一个整型或浮点型数
值,该方法用于设置画笔的朝向为to_angle,可简写为
turtle.seth(to_angle)。
·turtle.home():该方法设置画笔返回原点(0,0),并设置朝向为初始
方向。
·turtle.circle(radius,extent=None,steps=None):用于绘制圆形。参数
radius是一个数值,表示所画圆的半径。extent是一个数值或None,为
一个夹角,用来决定绘制圆的一部分,如果不指定extent参数,则会绘
制整个圆;如果*extent不是完整圆周,则以当前画笔位置为一个端点
绘制圆弧。如果radius为正值则朝逆时针方向绘制圆弧,否则朝顺时针
方向绘制圆弧。最终海龟的朝向会依据extent的值而改变。圆实际是以
其内切正多边形来近似表示的,其边的数量由steps指定,如果未指定
边数则会自动确定。此方法也可用来绘制正多边形。
·turtle.dot(size=None,*color):参数size是一个大于等于1的整型
数;参数color是一个颜色字符串或颜色数值元组,用于设置颜色。该
方法用于绘制一个直径为size、颜色为color的圆点。
·turtle.stamp():该方法用于绘制一个海龟形状,返回该印章的
stamp_id。
·turtle.clearstamp(stamp_id):参数stamp_id是一个整型数,它必须
是之前调用stamp()方法返回的一个数值,该方法用于删除stamp_id指
定的印章。
·turtle.clearstamps(n=None):参数n是一个整型数或是None,该方
法用于删除全部或前/后n个海龟印章。如果n为None,则删除全部印
章;如果n>0,则删除前n个印章;如果n<0,则删除后n个印章。
·turtle.undo():该方法用于撤销最近的一个(或多个)海龟动作。
·turtle.speed(speed=None):参数speed是一个0~10范围内的整型数
或速度字符串,该方法用于设置海龟的移动速度。移动速度范围是0~
10,速度值从1到10,画线和海龟转向的动画效果逐级加快;当参数
speed为0时,表示没有动画效果。具体的速度字符串与速度值的对应
关系如下:
·"fastest":0,最快。
·"fast":10,快。
·"normal":6,正常。
·"slow":3,慢。
·"slowest":1,最慢。
下面介绍常用的获取海龟的状态的方法。
·turtle.position():返回海龟当前的坐标(x,y),可简写为pos()。
·turtle.towards(x,y=None):参数x是一个数值或数值对/矢量,或是
一个海龟实例,而参数y的取值取决于x,如果x是一个数值,则y就是
一个数值,否则y为None。该方法返回海龟当前位置到(x,y)位置或其
他海龟位置这条直线的夹角。
·turtle.xcor():返回海龟的x坐标。
·turtle.ycor():返回海龟的y坐标。
·turtle.heading():返回海龟当前的朝向。
·turtle.distance(x,y=None):参数x是一个数值或数值对/矢量,或是
一个海龟实例,而参数y是一个数值,如果x是一个数值,否则为
None。该方法返回海龟与给定(x,y)位置,给定矢量或给定其他海龟之
间的距离。
下面介绍常用的度量单位设置相关的方法。
·turtle.degrees(fullcircle=360.0):参数fullcircle是一个数值,该方法
用于设置角度的度量单位,即设置一个圆周为多少度,默认值为
360°。
·turtle.radians():用于设置角度的度量单位为弧度,其值等于
degrees(2*math.pi)。
(2)画笔控制
下面介绍常用的设置绘图状态的方法。
·turtle.pendown():设置画笔落下,画笔在移动时将会画线,可简
写为turtle.pd()或turtle.down()。
·turtle.penup():设置画笔抬起,画笔在移动时不画线,可简写为
turtle.pu()或turtle.up()。
·turtle.pensize(width=None)和turtle.width(width=None):参数width
是一个正数值,该方法用于设置画笔的粗细为width或返回该值。
·turtle.pen(pen=None,**pendict):参数pen是一个包含部分或全部
下列键的字典,pendict是一个或多个以下列键为关键字的关键字参
数。该方法返回或设置画笔的属性,以一个包含以下键值对的“画笔字
典”表示。
·"shown":True/False;
·"pendown":True/False;
·"pencolor":颜色字符串或颜色元组;
·"fillcolor":颜色字符串或颜色元组;
·\"pensize":正数值;
·"speed":0~10范围内的数值;
·"resizemode":"auto"、"user"或"noresize";
·\"stretchfactor":(正数值,正数值);
·"outline":正数值;
·"tilt":数值。
这个字典可以作为pen()函数的参数,为画笔设置多个属性。
·turtle.isdown():返回一个布尔值,如果画笔落下,则返回True,
如果画笔抬起,则返回False。
下面介绍常用的颜色控制相关的方法。
·turtle.color(*args):用于返回或设置画笔颜色和填充颜色。参数
args有多种输入格式,具体如下:
·color():返回以一对颜色描述字符串或元组表示的当前画笔颜色
和填充颜色,两者可分别由pencolor()和fillcolor()返回。
·color(colorstring)、color((r,g,b))和color(r,g,b):输入格式与
pencolor()相同,同时设置填充颜色和画笔颜色为指定的值。
·color(colorstring1,colorstring2)和color((r1,g1,b1),(r2,g2,b2)):相当
于pencolor(colorstring1)加fillcolor(colorstring2),使用其他输入格式的
方法也与之类似。
·turtle.pencolor(*args):用于返回或设置画笔颜色,参数args具有4
种输入格式,具体如下:
·pencolor():返回以颜色描述字符串或元组表示的当前画笔颜色,
可用作其他color/pencolor/fillcolor调用的输入。
·pencolor(colorstring):设置画笔颜色为colorstring指定的Tk颜色描
述字符串,例如"red"、"yellow"或"#33cc8c"。
·pencolor((r,g,b)):设置画笔颜色为以r,g,b元组表示的RGB颜色。
r,g,b的取值范围应为0~colormode,colormode的值为1.0或255。
·pencolor(r,g,b):设置画笔颜色为以r,g,b表示的RGB颜色。r,g,b的
取值范围应为0~colormode。
·turtle.fillcolor(*args):用于返回或设置填充颜色。参数args具有多
种输入格式,具体如下:
·fillcolor():返回以颜色描述字符串或元组表示的当前填充颜色,
可用作其他color/pencolor/fillcolor调用的输入。
·fillcolor(colorstring):设置填充颜色为colorstring指定的Tk颜色描
述字符串,例如"red"、"yellow"或"#33cc8c"。
·fillcolor((r,g,b)):设置填充颜色为以r,g,b元组表示的RGB颜色。
r,g,b的取值范围应为0~colormode,colormode的值为1.0或255。
·fillcolor(r,g,b):设置填充颜色为r,g,b表示的RGB颜色。r,g,b的取
值范围应为0~colormode。
下面介绍常用的与填充相关的方法。
·turtle.filling():返回一个布尔值,表示填充状态。填充为True,
否则为False。
·turtle.begin_fill():在绘制要填充的形状之前调用。
·turtle.end_fill():填充上次调用begin_fill()之后绘制的形状。
下面介绍常用的与绘图控制相关的方法。
·turtle.reset():重置。该方法用于从屏幕中删除海龟的绘图,海龟
回到原点并设置所有变量为默认值。
·turtle.clear():清空。该方法用于从屏幕中删除指定海龟的绘图。
不移动海龟,海龟的状态和位置以及其他海龟的绘图不受影响。
·turtle.write(arg,move=False,align="left",font=("Arial",8,"normal")):
参数arg表示要书写到TurtleScreen的对象,是一个字符串;move是一
个布尔值(True/False),如果move为True,画笔会移动到文本的右下
角,默认move为False;align是一个字符串,用于指定对齐方式,其值
可以是"left"、"center"或"right";font用于指定文本字体,是一个三元
组(fontname,fontsize,fonttype)。该方法用于书写文本,将arg指定的字
符串书写到当前海龟位置。
(3)海龟状态
下面介绍与海龟可见性相关的方法。
·turtle.showturtle():使得海龟可见,可简写为turtle.st()。
·turtle.hideturtle():使得海龟不可见,可简写为turtle.ht()。
·turtle.isvisible():返回一个布尔值,表示海龟是否可见。返回
True表示海龟可见,返回False表示海龟不可见。
下面介绍与海龟外观相关的方法。
·turtle.shape(name=None):参数name是一个有效的形状名字符
串。该方法用于设置海龟形状为name指定的形状名,如果没有指定参
数name,则会返回当前的形状名。参数name指定的形状名应存在于
TurtleScreen的shape字典中。多边形的形状初始值包
括"arrow"、"turtle"、"circle"、"square"、"triangle"和"classic"。
·turtle.resizemode(rmode=None):参数rmode是一个字符串,其值
可以是"auto"、"user"或"noresize"之一。该方法用于设置大小调整模
式。如果没有指定参数rmode,则返回当前的大小调整模式。大小调
整模式含义如下:
·"auto":根据画笔粗细值调整海龟的外观。
·"user":根据拉伸因子和轮廓宽度(outline)值调整海龟的外
观,两者是由shapesize()设置的。
·"noresize":不调整海龟的外观大小。
·turtle.shapesize(stretch_wid=None,stretch_len=None,outline=None)
和turtle.turtlesize(stretch_wid=None,stretch_len=None,outline=None):这
两个方法作用相同,其中参数stretch_wid是一个正数值,为垂直于其
朝向的宽度拉伸因子;stretch_len是一个正数值,为平行于其朝向的长
度拉伸因子,决定形状轮廓线的粗细;outline是一个正数值。这两个
方法用于返回或设置画笔的x/y拉伸因子和轮廓。当且仅当大小调整模
式设为"user"时海龟会基于其拉伸因子调整外观。
·turtle.shearfactor(shear=None):参数shear是一个可选的数值,该
方法用于设置或返回当前的剪切因子。根据shear指定的剪切因子,即
剪切角度的切线来剪切海龟形状,不改变海龟的朝向(移动方向)。
如未指定shear参数,则返回当前的剪切因子,即剪切角度的切线,与
海龟朝向平行的线条将被剪切。
·turtle.settiltangle(angle):参数angle是一个数值。该方法用于旋转
海龟形状使其指向angle指定的方向,忽略其当前的倾角,不改变海龟
的朝向(移动方向)。
·turtle.tilt(angle):参数angle是一个数值。该方法用于设置海龟形
状自其当前的倾角转动angle指定的角度,但不改变海龟的朝向(移动
方向)。
(4)使用事件
下面介绍几个常用的使用事件的方法。
·turtle.onclick(fun,btn=1,add=None):参数fun是一个函数,调用时
将传入两个参数,表示在画布上单?的坐标;btn是一个鼠标按钮编
号,默认值为1,表示鼠标左键;add是一个布尔值(True/False),如
果为True则添加一个新绑定,否则将取代先前的绑定。该方法将fun指
定的函数绑定到鼠标单?此海龟事件。如果fun值为None,则移除现有
的绑定。
·turtle.onrelease(fun,btn=1,add=None):该方法的参数含义与
turtle.onclick()方法的相同。该方法表示将fun指定的函数绑定到在此海
龟上释放鼠标按键事件。如果fun值为None,则移除现有的绑定。
·turtle.ondrag(fun,btn=1,add=None):该方法的参数与
turtle.onclick()方法和turtle.onrelease()方法的参数含义相同。该方法表
示将fun指定的函数绑定到在此海龟上移动鼠标事件。如果fun值为
None,则移除现有的绑定。
(5)特殊海龟方法
下面介绍几个特殊海龟的方法。
·turtle.begin_poly():用于开始记录多边形的顶点。当前海龟的位
置为多边形的第一个顶点。
·turtle.end_poly():用于停止记录多边形的顶点。当前海龟的位置
为多边形的最后一个顶点,它将连线到第一个顶点。
·turtle.get_poly():用于返回最新记录的多边形。
·turtle.clone():用于创建并返回海龟的克隆体,具有相同的位置、
朝向和海龟属性。
·turtle.getturtle()和turtle.getpen():返回海龟对象自身,常用来作为
一个函数返回“匿名海龟”。
·turtle.getscreen():用来返回作为海龟绘图场所的TurtleScreen类对
象。该对象将可调用TurtleScreen方法。
·turtle.setundobuffer(size):参数size是一个整型数值或None。该方
法用于设置或禁用撤销缓存区。如果size为一个整型数值,则将开辟
一个指定大小的空缓冲区。size表示可使用undo()方法撤销的海龟命令
的次数上限。如果size为None,则禁用撤销缓冲区。
·turtle.undobufferentries():该方法用于返回撤销缓冲区里的条目
数。
·turtle.done():该方法用于关闭turtle,表示绘图完成。
关于turtle模块的更多其他方法在此就不介绍了,感兴趣的读者请
自行查阅相关的API文档。
3.算法设计
在前面的问题分析中,我们介绍了turtle模块的大部分绘图函数,
有了这些函数作为基础,下面就来分析本节我们要解决的问题。
要绘制直线,需要用到前面提到的以下几个方法。
·turtle.penup():画笔抬起。
·turtle.color():设置海龟或画笔颜色。
·turtle.goto():画笔移动到一个坐标位置。
·turtle.pendown():画笔落下。
4.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 画直线
import turtle
if __name__ == "__main__":
# 绘制折线
turtle.penup() # 提笔
turtle.color('green', 'red')
turtle.goto(100, 100)
turtle.pendown() # 落笔
turtle.goto(100, -100)
turtle.goto(-100, -100)
turtle.goto(-100, 100)
turtle.goto(100, 100)
turtle.goto(5, 215)
turtle.goto(-108, 90)
turtle.done()

在PyCharm下运行程序,结果如图11.1所示。

 5.拓展训练
使用turtle绘制直线,并计算点(x1,y1)到点(x4,y4)之间的距离。
根据前面讲解的turtle模块的相关函数方法,直接进行绘制。
完整的代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 绘图,计算(x1,y1)到(x4,y4)的距离
import turtle
import math
if __name__=="__main__":
# 定义多个点的坐标
x1, y1 = 100, 100
x2, y2 = 100, -100
x3, y3 = -100, -100
x4, y4 = -100, 100
x5, y5 = 100, 100
# 绘制折线
turtle.penup() # 提笔
turtle.goto(x1, y1)
turtle.pendown() # 落笔
turtle.goto(x2, y2)
turtle.goto(x3, y3)
turtle.goto(x4, y4)
turtle.goto(x5, y5)
# 计算起始点和终点的距离
distance = math.sqrt((x1-x4)**2 + (y1-y4)**2)
turtle.write(distance)
turtle.done()

在PyCharm下运行程序,结果如图11.2所示。

 

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐