2.4 添加颜色
这些螺旋线的形状不错,但是,如果它们能够更多彩一些,是不是更酷呢?让我们回到正方形螺旋线代码,在t = turtle.Pen()这一行的后面再添加一行代码,从而将钢笔颜色设置为红色。
SquareSpiral3.py
import turtle
t = turtle.Pen()
t.pencolor(“red”)
for x in range(100):
t.forward(x)
t.left(91)
运行该程序,我们将会看到正方形螺旋线的一个更多色彩的版本,如图2-4所示。
我们尝试用另一种常用的颜色(如“blue”或“green”)来替换掉“red”或“green”并且再次运行该程序。我们可以通过Turtle库使用数百种不同的颜色,包括一些奇怪的颜色,如“salmon”和“lemon chiffon”(访问http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm 可以查看完整的列表)。让整个螺旋线呈现一种不同的颜色是很不错的一步,但是,如果想要让每一边都显示一种不同的颜色,我们该怎么办呢?这需要对程序做一些更多的修改。
2.4.1 一个四色螺旋线
让我们来考虑一下算法(algorithm)。算法就是一系列的步骤,它可以将单色的螺旋线变为4色的螺旋线。大多数的步骤和之前的螺旋线程序中相同,但是,这里还增加了一些调整:
(1)导入turtle模块并且设置一个海龟;
(2)告诉计算机应该使用何种颜色;
(3)设置一个循环,绘制螺旋线中的100条线段;
(4)为螺旋线的每一边选取一种不同的钢笔颜色;
(5)向前移动海龟以绘制每一边;
(6)将海龟向左转,以准备好绘制下一边。
首先,我们需要颜色名称的一个列表,而不是单个的颜色,因此,我们要创建一个名为colors的列表变量并且在列表中放置4种颜色,如下所示。
colors = [“red”, “yellow”, “blue”, “green”]
这个4种颜色的列表,将会针对正方形的每一边给出一种颜色。注意,我们将颜色的列表放在了方括号“[”和“]”之间。这里要确保引号中的每一种颜色名都像我们在第1章中打印出来的单词一样,因为这些颜色名都是字符串(string)或文本值,这是我们稍后要传递给pencolor函数的值。正如前面所提到的,我们使用一个名为colors的变量来存储4种颜色的列表。因此,任何时候,当想要从列表中获取颜色的时候,我们都要使用colors变量来表示钢笔的颜色。记住,变量存储的值是变化的,这正如同其名称一样,变量嘛。
我们需要做的下一件事情是,每次遍历绘制循环的时候修改钢笔颜色。为了做到这一点,我们需要将t.pencolor()函数移入到for循环下的一组指令之中,还需要告诉pencolor函数,我们想要使用列表中的哪一种颜色。
我们输入如下的代码并运行它。
ColorSquareSpiral.py
import turtle
t = turtle.Pen()
colors = [“red”, “yellow”, “blue”, “green”]
for x in range(100):
t.pencolor(colors[x%4])
t.forward(x)
t.left(91)
4种颜色的列表起作用了,我们在这个运行的示例中看到了它们(如图2-5所示)。到目前为止,一切还不错。
pencolor函数中唯一的新增部分是(colors[x%4])。这条语句中的x和我们在程序中其他地方所使用的x是同一个变量,因此,x将持续从0~99增加,就像我们前面所见到的那样。圆括号中的colors变量名告诉Python,从我们在程序前面所添加的、名为colors的颜色名称列表中选取一种颜色。
[x%4]告诉Python我们将使用colors列表中的前4种颜色,即编号从0~3的颜色并且每当x变化的时候就遍历它们。在这个例子中,我们的颜色列表只有4种颜色,因此,我们需要一次又一次地遍历这4种颜色。
colors = [“red”, “yellow”, “blue”, “green”]
0 1 2 3
[x%4]中的“%”叫作模除操作符(modulo operator),表示一次除法运算中的余数(remainder)(5÷4商1余1,因此,5可以包含4一次并且还剩下1;6÷4余2,以此类推)。当我们想要遍历列表中一定数目的项时,例如我们对4种颜色列表所做的操作,模除操作符很有用。
在100步中,colors[x%4]将遍历4种颜色(0、1、2和3,分别表示红色、黄色、蓝色和绿色)整整25次。如果我们有时间(并且有一个放大镜),可以数一数图2-5中有25条红色的、25条黄色的、25条蓝色的和25条绿色的线段。第1次遍历绘制循环的时候,Python使用列表中的第一种颜色,红色;第2次遍历的时候,它使用黄色,以此类推。第15次遍历循环的时候,Python又回过头来使用红色,然后是黄色,等等;每通过循环4次之后,总是又回过头来使用红色。
2.4.2 修改背景颜色
让我们再次加入一点内容,创造出比图2-5更漂亮一些的内容。正如我5岁的儿子Alex所指出来的那样,黄色部分太难以识别出来了。这就像是在白色的绘画纸上使用黄色的蜡笔一样,屏幕上的黄色像素无法在白色背景上明显地显示出来。让我们把背景颜色修改为黑色,来修正这个问题。我们在程序中的import行之后的任何位置,输入如下的代码行。
turtle.bgcolor(“black”)
添加这一行之后,图片更加漂亮,所有的颜色现在都处在一个黑色的背景之上。注意,海龟钢笔(在程序中由变量t表示)没有任何变化。相反,我们修改了海龟屏幕的一些内容,也就是背景颜色。turtle.bgcolor()命令允许我们将整个绘制屏幕修改为Python中指定的任何颜色。在turtle.bgcolor(“black”)这一行中,我们选择了黑色作为屏幕颜色,因此,红色、黄色、蓝色和绿色都显示得很好。
此外,我们可以将循环中的range()修改为200甚至更大,以使得螺旋线中的正方形更大。在黑色背景上显示200个线段的新版本的图片,如图2-6
所示。
Alex总是想帮助我的程序变得更为惊人,他要求再做一项修改:如果现在把线段替换为圆,那会怎么样呢?那会不会是最酷的图片呢?好吧,我必须承认,这甚至会更酷。完整的代码如下所示。
ColorCircleSpiral.py
import turtle
t = turtle.Pen()
turtle.bgcolor(“black”)
colors = [“red”, “yellow”, “blue”, “green”]
for x in range(100):
t.pencolor(colors[x%4])
t.circle(x)
t.left(91)
我们可以在图2-7中看到结果。