
1.3 编程知识点
(1)turtle库
turtle库是Python入门级的图形绘制函数库,是Python自带的标准库之一。使用turtle库绘图,可以想象有一只海龟在画布上移动,默认初始位置在画布的正中心,海龟走过的轨迹就形成了绘制的图形。移动的海龟由程序控制,可以变换颜色、宽度、大小、位置、方向等。
用import调用turtle库可以有三种形式:
第一种直接用“import+turtle”导入turtle库,如图1-3所示。后续使用turtle库时,需要使用turtle库名。如果回车以后没有错误提示,则表示导入库成功。

图1-3 导入turtle库
第二种用“import+turtle+as+别名”导入turtle库,如图1-4所示,在后续使用turtle库时,可以直接用别名代替。如果回车以后没有错误提示,则表示导入库成功。

图1-4 导入turtle库,别名为pic
第三种用“from+库名+import*”导入turtle库,from import方式导入turtle库如图1-5所示,后续使用这个库里的函数或方法时,不需要再说明库名称。如果回车以后没有错误提示,表示导入库成功。

图1-5 from import方式导入turtle库
(2)画布的坐标系
turtle库画图的平面被称为画布(canvas),原点(0,0)在画布的正中央,即1/2画布高、1/2画布宽的位置。以画布中央的点为原点(0,0),建立一个横轴为x轴、纵轴为y轴的坐标系,小海龟画笔在画布上移动的位置,就可以在这个直角坐标系中确定下来,如图1-6所示。

图1-6 turtle画布中的坐标系
在画布中,坐标(x,y)的单位是像素。这个单位与液晶显示屏的尺寸及分辨率有关。屏幕越大,分辨率越小,像素代表的实际尺寸越大。
在画布中,点(20,-30)的位置在画布的右下角,即第4象限,距离y轴20像素,距离x轴30像素。
(3)移动画笔函数goto()
画笔的默认位置在画布中央。在turtle画布中,使用函数goto()可以移动画笔到指定位置。
移动画笔位置的程序代码如图1-7所示,导入turtle库,别名为pic,分别按顺序调用了4次turtle库中的函数goto()。最初,画笔在原点(0,0)的位置上,使用函数goto(100,100)将画笔从原点移动到了第1象限的(100,100)位置上;然后使用函数goto(-100,50)将画笔移动到了第2象限的(-100,50)位置上,再使用函数goto(-50,-50)将画笔移动到了第3象限的(-50,-50)位置,最后使用函数goto(50,-100)将画笔移动到了第4象限的(50,-100)位置。程序运行结果为如图1-8所示的画笔运行轨迹(黑色部分)。

图1-7 移动画笔位置的程序代码

图1-8 程序运行结果:移动画笔的轨迹
(4)画点函数dot()
在turtle库中,用来画点的函数为dot()。点最重要的属性就是位置,这和几何里点的属性一样。在几何里,点没有大小和颜色;但使用turtle库的画点函数时,点是可以指定大小和颜色的。格式为:

如dot(5,“green”)就是画一个直径为5的绿点。直接用dot(),不指定任何参数时,点的直径的默认大小是max(画笔宽度+4,2×画笔宽度),颜色是黑色。
画4个点的程序代码如图1-9所示。导入turtle库,别名为pic,分别按顺序调用4次turtle库中的函数dot()。这里没有使用函数goto()移动画笔的位置,所以画笔一直在原点(0,0)处。

图1-9 画4个点的程序代码
dot(100,“orange”)以原点为中心,画一个直径为100像素的橙色的点;dot(50,“red”)以原点为中心,画一个直径为50像素的红色的点;dot(10,“purple”)以原点为中心,画一个直径为10像素的紫色的点;pic.dot()以原点为中心,画一个默认大小的黑点。运行这段程序,得到的图形如图1-10所示。

图1-10 程序运行结果:位置在原点的不同大小的点
(5)抬笔函数penup()和落笔函数pendown()
在(0,0)、(50,0)、(100,0)处分别画三个点,代码如图1-11所示。画笔的初始位置在(0,0)处,调用函数dot()画一个默认大小的黑点;然后使用函数goto(50,0)将画笔挪到第二个点的位置,画同样的点;最后使用函数goto(100,0)将画笔挪到第三个点的位置,画一个同样的点。

图1-11 不同位置画三个点的程序代码
程序运行结果如图1-12所示。

图1-12 程序运行结果:画三个点(有画笔移动轨迹)
如果我们只想画三个点,不想呈现画笔移动的轨迹,该怎么办呢?画点的时候,使用落笔函数pendown(),移动画笔的时候使用抬笔函数penup(),程序代码如图1-13所示。在原点画一个点后,使用函数penup()抬笔,将画笔移动到(50,0)位置上,此时由于画笔处于“抬起”的状态,画笔并不留下移动痕迹。在位置(50,0)画第2个点之前,使用函数pendown()落笔。画第3个点也如此操作。程序运行结果如图1-14所示。

图1-13 不同位置画点(有抬笔、落笔)的程序代码

图1-14 程序运行结果:画三个点(没有画笔移动轨迹)
(6)for循环
在上面画3个点的示例中,调用函数dot()三次,调用函数goto()、落笔函数pendown()、抬笔函数penup()各两次。如果画很多点,就要重复很多次上面的代码,非常烦琐。对于这种有规律可循的动作,用循环语句实现可以大大简化编程复杂度。
比如,在画三个点的程序中,使用for循环来简化代码,如图1-15所示。需要画的点数越多,代码的简化量越大。

图1-15 使用for循环简化画三个点的程序代码
在for循环中,执行的动作包括抬笔penup()、移动画笔goto()、落笔pendown()、画点dot()4个动作。虽然在图1-15的左图中,由于在原点处画第1个点,没有抬笔、移动画笔、落笔的动作,但为了实现循环,在画笔初始位置画点时同样加上抬笔、移动到原点、落笔的动作。
在函数range(3)中确定了for循环的次数。range(3)相当于0,1,2三个数,i依次从这三个数中取值。变量x是为了依次生成3个点的坐标位置。这3个点在x轴上,间距是50像素。
(7)随机数
在Python中产生随机数需要调用random库。randint()函数用于随机生成一个指定范围内的整数。如randint(a,b)生成[a,b]之间包括a和b的整数,其中a≤b。

默认画布的长为400像素,高为300像素。为了在画布上生成一个点的随机位置,可以使用函数randint()生成坐标和直径。x可以在[-200,200]中随机选取,y可以在[-150,150]中随机选取。点的直径d可以在[1,50]中随机选取。
randint(-200,200)、randint(-150,150)、randint(1,50)生成的数如图1-16所示。每次运行这些函数时,生成的整数是不一样的。

图1-16 随机生成一个整数的程序代码