
昨天 Tyree 学第9课的时候,可开心了。那个旋转正方形花的程序,他改了又改:把36个正方形改成72个,又把左转角度从10°改成5°。
然后趴在屏幕前看着海龟一圈一圈地转,嘴里喊:“妈你看,这个花越来越密了,像一个大彩盘!”

不过他也有卡住的地方。写嵌套循环的时候,他又忘了在 for 后面加冒号。
程序一运行就报错,他“哎呀”一声,拍了下脑袋说:“又是冒号!”现在他已经养成习惯了:只要手指打完 for,就自动去按冒号键。这个冒号,他总算是记住了。
其实很多刚开始接触的小伙伴都会这种忘了打冒号的时候,或者忘了第二行缩进。
这需要平时多加练习,多敲键盘,多默写去敲。这样反复多练,时间久了就会形成肌肉记忆了,想犯错都难了。
还有一个:他改背景颜色的时候,想用绿色,结果写成了 "geren"。运行后绿色没出来,他盯着屏幕看了半天,最后指着报错信息跟我说:“妈妈,这里说 "<string>,line8,in dgcolor“是不是我颜色名字写错了?”

我让他把单词跟前面的 "green" 对比一下,他自己找出了拼写错误,改过来之后,绿色一下子跳出来了。他跟我说:“原来报错不是和我作对,是在纠正我。”
今天第10课,要画万花筒了。Tyree 说他很早就想试试“螺旋”效果,让图形一边转一边变大,看看最后能变成什么样。
我猜他一会儿肯定会把循环次数调到200,然后电脑跑半天,他在旁边傻乐。
好了,不多说了。我们直接开始第10课,痛痛快快地玩一把万花筒。
01 什么是万花筒图案?
万花筒的特点是:对称、重复、色彩丰富。
我们用 外层循环、控制旋转角度(每次画完一个图形,转一点角度),内层循环画一个基本图形(比如正方形、五角星),再加上颜色变化和边长逐渐变大,就能做出万花筒效果。
02 最简单的万花筒:旋转正方形花
我们来先看代码,然后一行一行来解释:
import turtle # 第1行:导入海龟绘图工具箱
t = turtle.Turtle() # 第2行:创建一只海龟,取名叫 t
t.speed(0) # 第3行:速度设为最快(0表示瞬间画完,不播动画)
t.pensize(2) # 第4行:画笔粗细为2像素
turtle.bgcolor("black") # 第5行:把画布背景设为黑色(这样彩色线条更明显)
colors = ["red", "orange", "yellow", "green", "blue", "purple"] # 第6行:颜色列表
for i in range(36): # 第7行:外层循环,要画36个正方形
t.pencolor(colors[i % 6]) # 第8行:从颜色列表里选一个颜色。
for j in range(4): # 第9行:内层循环,画一个正方形的4条边
t.forward(100)
t.right(90) # 第11行:右转90度(准备画下一条边)
t.left(10) # 第12行:画完一个正方形后,海龟左转10度
turtle.done() # 第13行:画完后保持窗口不关闭

为什么这样写呢,下面来看一下。(代码后面的#后的内容,是注释,程序不运行的,可以不写。)
第7行 for i in range(36):我们想要一圈正方形,每个正方形只比前一个旋转一点点。一圈是360°,如果每个正方形旋转10°,就需要36个(360÷10=36)。
第8行 colors[i % 6]:颜色列表有6种颜色,i从0到35,i % 6 会得到0,1,2,3,4,5,0,1,2,... 这样颜色就能循环变化,不会只用完6次就没了。
第9-11行:内层循环画一个正方形。为什么是 range(4)?因为正方形有4条边。为什么右转90°?因为正方形的外角是90°。
第12行 t.left(10):画完一个正方形后,让海龟左转10°,这样下一个正方形的方向就改变了,最终围成一圈。
同时我也在上面代码的,每一行后面都作了注释,不明白的可以反复的琢磨一下,会有惊喜的。
03 添加边长渐变(螺旋感)
现在让每个正方形的边长逐渐变大,这样图形就会向外螺旋展开:
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(2)
turtle.bgcolor("black")
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i in range(72): # 外层循环72次(每次转5°,一圈360°)
t.pencolor(colors[i % 6])
length = 50 + i * 1.5 # 边长 = 50 + i×1.5,i越大边长越大
for j in range(4):
t.forward(length) # 用变化的边长画边
t.right(90)
t.left(5) # 每次左转5°,72次刚好一圈
turtle.done()

range(72) + t.left(5):72×5=360°,刚好转一圈,图案会更密集(因为每个正方形只转5°,比之前的10°更细密)。
length = 50 + i * 1.5:i从0到71,i * 1.5从0到106.5,加上50后,边长从50逐渐长到156左右。这样画出的正方形会越画越大,像一朵向外绽放的花。
04 变换基本图形:用五角星代替正方形
把内层循环的正方形改成五角星。五角星需要循环5次,每次右转144°。
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(2)
turtle.bgcolor("black")
colors = ["red", "yellow", "green", "cyan", "blue", "magenta"]
for i in range(36):
t.pencolor(colors[i % 6])
length = 50 + i
for j in range(5): # 五角星有5条边,所以循环5次
t.forward(length)
t.right(144) # 五角星的外角是144°(不是90°)
t.left(10)
turtle.done()

为什么是144°?
五角星的每个尖角是36°,海龟走到尖角时需要转一个“外角”,外角 = 180° - 36° = 144°。你可以在纸上画一个五角星,沿着边走路,每次转弯的角度就是144°。
05 画彩虹圆环万花筒(用圆形)
这次不用多边形,直接用 circle 画圆,并且半径逐渐增大。
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(2)
turtle.bgcolor("black")
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i in range(72):
t.pencolor(colors[i % 6])
t.circle(50 + i) # 画一个半径=50+i的圆,半径越来越大
t.left(5) # 每次左转5度,72次转一圈
turtle.done()

为什么 t.circle(50+i) 能画出一圈圈圆?
t.circle(r) 会以海龟当前位置为起点,画一个半径为 r 的圆。画完后海龟会回到起点,但方向不变。
然后我们左转5°,再画下一个更大的圆,这些圆就会相互交叉,形成美丽的彩虹圆环。
06 终极万花筒:随机颜色与随机边长(选做)
引入 random 模块,让程序每次运行都产生不同的图案。我们将在下一节课画讲这个如何去写代码去生成的!
07 如何保存你画的图?
如果你画出了一个特别满意的图案,想把它存下来,可以加上这几行代码:
ts = t.getscreen()
ts.getcanvas().postscript(file="wanhuatong.eps")
完整示例(正方形螺旋万花筒+保存):
python
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(2)
turtle.bgcolor("black")
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
for i in range(72):
t.pencolor(colors[i % 6])
length = 50 + i
for j in range(4):
t.forward(length)
t.right(90)
t.left(5)
ts = t.getscreen()
ts.getcanvas().postscript(file="wanhuatong.eps") # 保存为.eps文件
turtle.done()

保存的文件在哪里呢?
文件会保存在你当前运行的 .py 文件所在的文件夹。

如果你还没保存过 .py 文件,建议先点击 Thonny 的“保存”按钮,把代码保存到桌面,然后再运行。这样 wanhuatong.eps 就会出现在桌面上。
.eps 是一种图片格式,可以用系统自带的“照片”应用打开,或者上传到在线转换工具转成 PNG/JPG。
08 课后小挑战(选做)
A 改变旋转方向:把 t.left 改成 t.right,图案会反向旋转,看看效果有什么不同。
B 增加填充色:在画每个图形前加 t.begin_fill(),并设置 t.fillcolor("某个颜色"),画完后加 t.end_fill(),图形就变成实心的了。
C 减少旋转步长:把 t.left(5) 改成 t.left(3),图案会更密,可能需要更多循环次数才能转一圈。
D保存多张图片:画完一个阶段后,用 time.sleep(2) 暂停2秒,然后保存不同文件名的图片。
09 总结一下今天都学到了什么?
边长渐变 length = 50 + i * 1.5 让图形越画越大,产生螺旋感
替换内层图形 内层循环可以画正方形、五角星、圆、任意多边形,改变 sides 和 angle 即可
保存图片getcanvas().postscript(file="名字.eps") 将当前画布存为图片
好了,今天课程完成咯,记得多敲键盘哦!
到现在为止,我们阶段一(Python核心入门 + turtle画图) 的内容告一段落,重复的去练习是让我们记忆的捷径,记得多练!!
从第11课开始,我们将进入阶段二:用编程探索兴趣,学习字符串处理、文件读写、随机数,并动手制作 三体名言抽卡、水熊虫生存模拟等趣味项目。
————热门推荐————
自学编程第8课:turtle画对称图形(彩色螺旋、彩色对称花、等边三角形、五角星)
自学编程第7课:turtle画图入门(画一个正方形,五角形,螺旋形,三角形)
自学编程第2课:用input让电脑问你名字(做一个打招呼程序)
自学编程第一步:安装Python和Thonny(零基础图文教程)
(本系列教程每天更新,欢迎关注收藏)