1. 初识海龟你的第一个Python绘图程序还记得小时候学画画吗拿起笔在纸上涂鸦那种创造的快乐。Python的海龟绘图Turtle Graphics就能让你找回这种感觉而且是在电脑屏幕上用代码来画画。它可不是什么高深莫测的新玩意儿它的历史比很多人的年龄都大诞生于1966年的Logo语言。那时候孩子们就是用“海龟”这个形象来学习编程和几何的。现在它被完美地集成到了Python里成了一个内置模块这意味着你不需要安装任何额外的东西打开Python就能玩。为什么说它特别适合编程新手和创意开发者呢因为它把抽象的代码指令变成了一个你看得见、摸得着的“小海龟”在屏幕上爬行的过程。你写一行代码比如让它前进100步你就能立刻看到它画出一条100像素长的线。这种即时、可视化的反馈是学习编程概念比如循环、函数、坐标最好的方式之一远比对着黑漆漆的控制台打印数字要有趣得多。我们先来点最直接的。打开你的Python编辑器或者IDLE甚至是在线Python环境输入下面这几行代码import turtle t turtle.Turtle() t.forward(100)运行它。看到了吗一个窗口弹出来一个箭头默认的海龟形状从屏幕中央向右移动画出了一条横线。屏幕中央就是坐标原点(0,0)向右是X轴正方向向上是Y轴正方向。这个“小海龟”有三个核心属性位置它在哪儿、方向它面朝哪边和笔笔有没有落下是什么颜色、多粗。你所有的绘图魔法都基于对这三个属性的控制。仅仅前进和后退太单调了我们让它转个弯。试试这个import turtle t turtle.Turtle() for i in range(4): t.forward(100) t.left(90)一个标准的正方形就画出来了t.left(90)是让海龟向左转90度。这里用了一个for循环重复执行了4次“前进-左转”的动作。这就是编程的魅力用简单的指令组合和循环创造出规整的图形。你可以试着把range(4)改成range(6)把left(90)改成left(60)猜猜会画出什么对一个六边形通过这样简单的修改你已经在探索几何图形的基本规律了。2. 掌握画笔从单调线条到多彩艺术画出了形状我们自然想让作品更漂亮。海龟的“笔”属性就是我们的调色板和画笔工具箱。默认的笔是黑色的细线条。我们来给它换个装扮。首先改变笔的颜色和粗细。pencolor()和color()都可以设置颜色你可以用英文颜色名比如red,blue,green也可以用RGB元组比如(1, 0, 0)表示红色。pensize()或width()用来设置线条宽度。import turtle t turtle.Turtle() t.pensize(5) t.pencolor(red) for i in range(4): t.forward(100) t.right(90) # 这次用右转现在画出来的是一个粗壮的红色正方形边框。但只有边框还不够我们经常需要填充颜色。这就用到了fillcolor()来设定填充色然后用begin_fill()和end_fill()把需要填充的图形“包”起来。import turtle t turtle.Turtle() t.color(blue, yellow) # 第一个参数是笔色第二个是填充色 t.begin_fill() for i in range(4): t.forward(100) t.left(90) t.end_fill()运行后你会得到一个蓝色边框、黄色填充的正方形。这里我用了一个更简洁的color()方法一次性设置了笔色和填充色。一个我早期常犯的错误是忘了写end_fill()结果程序一直等着填充后面画的乱七八糟的线条全被填上了颜色画面一团糟。所以记住begin_fill()和end_fill()必须成对出现。颜色还能玩出更动态的花样。比如让颜色在循环中渐变。这需要一点点RGB色彩模型的知识每个颜色由红、绿、蓝三个分量组成每个分量取值在0到1之间。我们可以让其中一个分量随着循环变化。import turtle t turtle.Turtle() t.speed(0) # 最快速度否则画得慢 t.pensize(2) for i in range(36): # 蓝色分量从0渐变到1红色固定为1绿色固定为0.5 t.color(1, 0.5, i/35) t.forward(100) t.left(170) # 转一个奇怪的角度形成复杂图案这段代码会画出一个色彩从红紫色渐变为粉紫色的复杂旋转图案。通过i/35我们让蓝色分量从0线性增加到1。这种在循环中动态改变属性的思路是创作复杂艺术图案的关键。你可以尝试固定其他两个分量或者让两个分量同时变化看看能混合出什么意想不到的色彩序列。3. 玩转图形圆形、弧形与复杂图案正方形和六边形是基础但世界是圆的。海龟绘图里画圆非常简单一个circle()函数就搞定。circle(100)就是以海龟左侧100像素的点为圆心画一个半径为100的圆。如果半径是正数海龟逆时针画圆半径是负数则顺时针画圆。这个“左侧为圆心”的规则一开始可能有点绕多试几次就习惯了。画圆的一个经典练习是画“同心圆”。思路是画一个圆然后把海龟向上移动一点圆心就上移了再画一个更大或更小的圆。但这里有个坑海龟画完圆后会回到起点。如果我们直接forward()海龟是从圆上的某点开始移动而不是从圆心移动。所以正确做法是先把笔抬起来 (penup())移动到新位置再把笔放下 (pendown())。import turtle t turtle.Turtle() t.speed(0) step 10 # 每次半径增加10圆心下移10 for r in range(10, 100, step): t.circle(r) t.penup() t.right(90) # 转向下 t.forward(step) # 向下移动为下一个圆的圆心做准备 t.left(90) # 转回向右 t.pendown()circle()函数还有个强大的功能画弧。它的第二个参数可以指定画多少度。circle(100, 90)就是画一个半径为100的90度圆弧。利用这个我们可以画出花瓣、齿轮等不规则图形。import turtle t turtle.Turtle() t.speed(0) t.pensize(2) for i in range(12): t.circle(80, 60) # 画一段60度的弧 t.left(120) # 向左转120度 t.circle(80, 60) # 再画一段60度的弧 t.left(120) # 再转120度准备画下一个花瓣 # 实际上两次左转120度加上圆弧本身的角度总共转了300度 # 这里逻辑需要调整更好的画花瓣方法是 # for i in range(6): # t.circle(100, 60) # t.left(120) # t.circle(100, 60) # t.left(120)上面注释里我纠正了自己一开始的错误逻辑。画一个由两个圆弧组成的花瓣正确步骤是画一段弧转一个角度让海龟头朝向花瓣内侧再画一段弧然后转一个角度让海龟头朝向画下一个花瓣的起始方向。多调试几次角度参数你会对几何运动有更直觉的理解。这种试错过程本身就是学习的一部分。4. 让海龟活起来动画与交互设计静态图形很美但让图形动起来才是海龟绘图最吸引人的地方。这里的“动画”原理和传统动画一样快速连续地显示一系列静态画面。在海龟绘图中我们可以通过循环、延时和擦除来实现。最简单的动画是让一个物体移动。比如让一个圆从左边移动到右边。import turtle import time screen turtle.Screen() t turtle.Turtle() t.shape(circle) # 把海龟形状改成圆球 t.penup() # 拾笔移动时不画线 t.goto(-200, 0) # 初始位置在左边 t.pendown() for x in range(-200, 201, 5): # 从-200到200每次移动5像素 t.clear() # 清除海龟之前画的所有东西在这个例子中它没画所以主要是清除自己 t.goto(x, 0) # 移动到新位置 time.sleep(0.05) # 短暂延时控制动画速度但time.sleep()会阻塞整个程序动画会卡顿。更专业的方法是使用海龟模块自带的turtle.ontimer()或者screen.update()配合turtle.tracer(0, 0)。后者可以关闭自动刷新由我们手动控制刷新时机从而实现平滑动画。import turtle screen turtle.Screen() screen.tracer(0, 0) # 关闭自动刷新手动控制 t turtle.Turtle() t.shape(square) t.penup() def move(): x t.xcor() # 获取当前x坐标 if x 200: x -200 # 如果超出右边界回到左边界 t.setx(x 2) # x坐标增加2 screen.update() # 手动刷新屏幕 screen.ontimer(move, 30) # 30毫秒后再次调用move函数 move() screen.mainloop()这段代码创建了一个永动的动画一个方块从左向右移动移出右边界后瞬间回到左边界重新开始。screen.ontimer(move, 30)是核心它设置了一个“定时器”30毫秒后自动调用move函数自己形成循环。这是制作游戏和复杂动画的基础框架。除了自动动画我们还可以让用户通过鼠标和键盘来交互。screen.onclick(函数名)可以监听鼠标点击事件点击坐标会传给这个函数。screen.onkey(函数名, ‘键名’)可以监听键盘按键但需要先调用screen.listen()开始监听。import turtle def draw_dot(x, y): t.penup() t.goto(x, y) t.pendown() t.dot(20, red) # 画一个直径20的红色圆点 def clear_screen(): t.clear() screen turtle.Screen() t turtle.Turtle() t.speed(0) t.hideturtle() # 隐藏海龟箭头我们只需要看画的点 screen.onclick(draw_dot) # 点击哪里就在哪里画红点 screen.onkey(clear_screen, c) # 按C键清屏 screen.listen() screen.mainloop()这个程序就变成了一个简单的绘图板用鼠标点击画画按C键清空。你可以在此基础上扩展比如按不同数字键切换画笔颜色按上下键调整笔刷大小等等。这种即时反馈的交互能让你快速验证想法做出有趣的小工具或游戏原型。5. 创意实战设计你的专属动画作品掌握了基本工具和动画原理是时候把它们组合起来创作一个有点意思的完整作品了。我们来设计一个“星空闪烁”的动画深蓝色背景上随机位置出现大小、颜色、亮度不同的星星并且星星的亮度还在周期性变化。这个项目会用到我们学过的几乎所有知识随机数、循环、颜色设置、坐标控制、定时动画。首先我们需要一个深蓝色的画布并且隐藏海龟光标。import turtle import random import math screen turtle.Screen() screen.bgcolor(navy) # 背景设为海军蓝 screen.tracer(0, 0) # 关闭自动刷新 # 我们不止一只海龟而是用一群海龟来代表星星 stars []接下来我们创建一个函数来生成一颗星星。星星其实就是一个很小的、颜色明亮的圆形海龟。我们让它出现在随机位置有随机的大小和初始颜色。def create_star(): star turtle.Turtle() star.shape(circle) star.penup() # 随机位置范围在屏幕内 x random.randint(-screen.window_width()//2, screen.window_width()//2) y random.randint(-screen.window_height()//2, screen.window_height()//2) star.goto(x, y) # 随机大小 (1到3) size random.uniform(0.5, 3) star.shapesize(stretch_widsize, stretch_lensize) # 随机初始颜色和亮度因子 color_variation random.uniform(0.6, 1.0) # 亮度因子 star.color((color_variation, color_variation, color_variation)) # 灰度色模拟星光 star.brightness_speed random.uniform(0.02, 0.08) # 闪烁速度 star.brightness_direction 1 # 亮度变化方向1为增-1为减 star.current_brightness color_variation stars.append(star)然后我们需要一个让所有星星“呼吸”闪烁的函数。这个函数会遍历所有星星轻微地增加或减少它们的亮度RGB值并在达到边界时反转变化方向。def twinkle_stars(): for star in stars: # 更新亮度 star.current_brightness star.brightness_speed * star.brightness_direction # 边界检查 if star.current_brightness 1.0: star.current_brightness 1.0 star.brightness_direction -1 # 开始变暗 elif star.current_brightness 0.3: # 设置一个最小亮度不至于全黑 star.current_brightness 0.3 star.brightness_direction 1 # 开始变亮 # 应用新颜色 c star.current_brightness star.color((c, c, c))最后我们需要一个主循环函数它负责定期调用闪烁函数并刷新屏幕。同时我们还可以在循环里偶尔创建新的星星模拟星星的动态出现。def animate(): # 偶尔创建一颗新星 if random.random() 0.05: # 5%的概率 create_star() # 控制星星总数避免太多 if len(stars) 150: old_star stars.pop(0) old_star.hideturtle() del old_star twinkle_stars() # 让所有星星闪烁 screen.update() # 刷新屏幕 screen.ontimer(animate, 50) # 50毫秒后继续 # 初始化一些星星 for _ in range(80): create_star() animate() screen.mainloop()运行这个程序你就能看到一个深邃的蓝色夜空中星星在随机位置闪烁明灭偶尔还有新的星星诞生。这个项目虽然代码量不大但融合了对象管理多个海龟对象、状态更新亮度、随机性和动画循环。你可以尝试修改参数调整背景色、星星的闪烁速度范围、颜色改成随机的暖色调、甚至让星星缓慢移动模拟流星效果。我踩过的一个坑是一开始没有控制星星的总数不断创建新海龟对象导致程序越来越卡。后来才加入了pop(0)来移除最老的星星并显式删除对象内存就稳定了。这种性能考量在制作更复杂动画时非常重要。