Python标准库程序框架——turtle海龟绘图
我想,科普最好的对象是小朋友,那么就写一下被移植到Python标准库里的turtle库吧。以下代码基于Python 3.8.1。
概述
海龟绘图,最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所专门为引导儿童学习编程创造的 Logo 编程语言。turtle库的实现过程很形象,犹如一只海龟在画布上画画。海龟绘图很适合用来培养小朋友对编程的学习兴趣。
试想象一下,在一块画布上,起始位置在x-y平面的(0,0)点,执行```import turtle``来召唤一只拿着画笔的海龟(也就是一个点),再利用turtle库里一系列的指令(方法)来指挥这只海龟来爬。最后通过组合这些指令,海龟爬行的轨迹将可以轻松地绘制出精美的形状和图案。并且通过对应函数,能按我们的要求把海龟的轨迹在显示设备上输出显示。
目前的turtle模块是基于Python标准发行版2.5重新编写和扩展,并与原模块100%兼容。因此能以交互方式使用模块的所有命令、类和方法。
turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。具体如下:
面向对象:
TurtleScreen 类定义图形窗口作为绘图海龟的运动场。它的构造器需要一个 tkinter.Canvas 或 ScrolledCanvas 作为参数。应在 turtle 作为某个程序的一部分的时候使用。
Screen() 函数返回一个 TurtleScreen 子类的单例对象。此函数应在 turtle 作为独立绘图工具时使用。作为一个单例对象,其所属的类是不可被继承的。
TurtleScreen/Screen的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
RawTurtle 类定义海龟对象在TurtleScreen上绘图。它的构造器需要一个 Canvas, ScrolledCanvas 或 TurtleScreen作为参数,以指定 RawTurtle对象在哪里绘图。
从 RawTurtle派生出子类Turtle,该类对象在Screen实例上绘图,若实例不存在则会自动创建。
RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分
面向过程:
过程式接口提供与Screen 和Turtle类的方法相对应的函数。函数名与对应的方法名相同。当Screen类的方法对应函数被调用时会自动创建一个Screen 对象。当Turtle类的方法对应函数被调用时会自动创建一个 (匿名的)Turtle 对象。
当需要屏幕上有多个海龟的时候,就必须使用面向对象的接口。
可用的turtle和Screen方法
如前文所说,我们通过import turtle召唤了一只拿着画笔的海龟,海龟的的动作以及画笔都是通过方法来控制的。同时,作为一只被召唤出来的二维生物,我们作为比他高维的生物,自然有很多降维操纵甚至打击的方法。从某种角度上来说,我们对这些turtle有近乎神迹般的操纵和控制。 然而并不是。具体方法如下。
RawTurtle/Turtle方法和对应函数
以下都是使用Turtle类的实例,命名为turtle。
海龟动作
我们能控制海龟的前进后退,左转右转,爬行速度,甚至能让海龟像赛亚人或者哈利波特里的巫师一样学会幻影移行,同时能随时获知海龟的位置信息。
移动和绘制
forward(distance) :前进distance距离
>>> turtle.position()
(0.00,0.00)
>>> turtle.forward(distance)
>>> turtle.position()
(distance,0.00)
>>> turtle.forward(distance)
>>> turtle.position()
(distance+distance,0.00)
backward(distance) :后退distance距离
>>> turtle.position()
(0.00,0.00)
>>> turtle.backward(distance)
>>> turtle.position()
(-distance,0.00)
right(angle) :右转angle个单位
>>> turtle.heading()
22.0
>>> turtle.right(angle)
>>> turtle.heading()
22.0-angle+360.0
left(angle):左转angle个单位
>>> turtle.heading()
22.0
>>> turtle.left(angle)
>>> turtle.heading()
22.0+angle
goto(x,y=None) | setposition(x,y=None) :前往/定位一个绝对坐标
setx(x) 设置x坐标
sety(y) 设置y坐标
setheading(to_angle) 设置朝向
import turtle
from turtle import *
color('red', 'yellow')
turtle.setheading(90)
turtle.heading()
done()
home() 返回原点
circle(radius, extent=None, steps=None) 画圆
import turtle
from turtle import *
color('red', 'yellow')
turtle.home()
turtle.position()
turtle.heading()
turtle.circle(50)