Python Turtle 颜色填充艺术:从基础图形到创意组合

📅 2026/7/15 2:47:34
Python Turtle 颜色填充艺术:从基础图形到创意组合
1. Python Turtle 颜色填充基础入门第一次接触 Python Turtle 的颜色填充功能时我完全被它的简单直观震撼到了。还记得当时用几行代码就画出一个蓝色正方形的那种成就感吗Turtle 的颜色填充就像小时候用的填色本只不过现在是用代码来控制画笔。fillcolor()是设置填充颜色的关键函数它支持多种颜色表示方式。最常用的是颜色名称字符串比如 red、blue或者十六进制颜色码 #FF0000。我特别喜欢用颜色名称因为它们更直观写代码时一眼就能知道是什么颜色。import turtle t turtle.Turtle() t.fillcolor(skyblue) # 使用颜色名称 t.fillcolor(#87CEEB) # 使用十六进制颜色码begin_fill()和end_fill()这对搭档决定了填充的范围。begin_fill() 相当于告诉电脑我要开始画一个封闭图形了记得等下把这里填上颜色end_fill() 则是说图形画完了现在可以填充了。这两个函数必须成对出现就像括号一样。t.begin_fill() # 这里绘制图形 t.end_fill()实际绘制时最容易犯的错误是忘记让图形闭合。有一次我画三角形时少转了一个角度结果填充效果完全不对。记住填充只对闭合图形有效就像你不能用颜料填满一个没有闭合的圆圈。2. 基础图形填充实战让我们从最简单的正方形开始。画正方形的逻辑很直接前进一段距离右转90度重复四次。但加上颜色填充后代码就变得生动起来。t.fillcolor(coral) t.begin_fill() for _ in range(4): t.forward(100) t.right(90) t.end_fill()三角形稍微复杂一点因为要计算正确的转向角度。等边三角形的每个内角都是60度但我们需要的是外角也就是120度。这是我初学时经常混淆的地方。t.fillcolor(lightgreen) t.begin_fill() for _ in range(3): t.forward(100) t.left(120) # 注意这里是左转120度 t.end_fill()圆形是最简单的因为 Turtle 提供了现成的 circle() 方法。但要注意的是circle() 方法的参数是半径不是直径。我曾经因为这个错误画出了比预期大两倍的圆。t.fillcolor(gold) t.begin_fill() t.circle(50) # 半径50 t.end_fill()六边形可以看作是六个等边三角形的组合。每个转角是60度画六边形时我总联想到蜂巢的结构。t.fillcolor(lavender) t.begin_fill() for _ in range(6): t.forward(80) t.right(60) t.end_fill()星星是最有趣的特别是五角星。画五角星的关键在于找到正确的角度 - 144度。这个角度是怎么来的因为五角星每个尖角对应的圆心角是72度而我们需要的是外角。t.fillcolor(hotpink) t.begin_fill() for _ in range(5): t.forward(150) t.right(144) t.end_fill()3. 颜色搭配与高级技巧单一颜色填充很快会让人觉得单调。我发现在Turtle中实现渐变填充效果虽然不如专业绘图软件那么方便但通过巧妙组合也能达到不错的效果。颜色混合是一个有趣的技巧。比如要画一个红黄渐变的太阳可以这样实现colors [red, orange, yellow] for i, color in enumerate(colors): t.fillcolor(color) t.begin_fill() t.circle(100 - i*30) t.end_fill()透明度效果在Turtle中可以通过颜色叠加来模拟。比如要画一个半透明的蓝色图层t.fillcolor(#0000FF80) # 最后两位表示透明度 t.begin_fill() t.circle(80) t.end_fill()图案填充虽然Turtle不直接支持但我们可以用小图形组合来实现。比如用多个小圆填充一个大圆for _ in range(36): t.begin_fill() t.circle(5) t.end_fill() t.forward(15) t.right(10)边框与填充色分离能让图形更专业。我习惯先设置填充色再设置画笔色t.fillcolor(lightblue) t.pencolor(navy) t.pensize(3) t.begin_fill() t.circle(70) t.end_fill()4. 复杂图形组合艺术当掌握了基础图形的填充后就可以尝试更有挑战性的组合图形了。我的第一个复杂作品是一朵花由多个填充了不同颜色的花瓣组成。花朵图案是很好的练习项目。中心用黄色圆形周围用红色花瓣# 花心 t.fillcolor(yellow) t.begin_fill() t.circle(20) t.end_fill() # 花瓣 t.fillcolor(red) for _ in range(8): t.begin_fill() t.circle(40, 60) # 画60度的弧 t.left(120) t.circle(40, 60) t.end_fill() t.left(60)几何艺术画可以通过重复简单图形实现。比如这个彩色螺旋colors [red, purple, blue, green, orange, yellow] for x in range(360): t.pencolor(colors[x % 6]) t.fillcolor(colors[x % 6]) t.begin_fill() t.circle(x/10 1) t.end_fill() t.left(59)动物简笔画也很受欢迎。比如画一只填充了颜色的乌龟# 龟壳 t.fillcolor(darkgreen) t.begin_fill() t.circle(50) t.end_fill() # 头部 t.fillcolor(lightgreen) t.begin_fill() t.circle(20) t.end_fill()城市剪影展示了填充技术的另一种应用。通过叠加不同颜色的矩形buildings [(100, 200, gray), (80, 150, darkgray), (120, 180, dimgray)] for width, height, color in buildings: t.fillcolor(color) t.begin_fill() for _ in range(2): t.forward(width) t.left(90) t.forward(height) t.left(90) t.end_fill() t.forward(width 10)5. 常见问题与优化技巧在创作过程中我遇到过各种奇怪的问题。比如有一次填充颜色不显示折腾了半天才发现是忘记调用end_fill()。还有一次图形填充不全原来是图形没有完全闭合。填充顺序很重要。当图形有重叠部分时后画的会覆盖先画的。我曾经想画一个红圈里面一个蓝圈结果顺序反了蓝圈完全被盖住了。# 正确的顺序 t.fillcolor(red) t.begin_fill() t.circle(100) t.end_fill() t.fillcolor(blue) t.begin_fill() t.circle(50) t.end_fill()性能优化在复杂图形中很关键。当图形很多时可以关闭动画加速绘制turtle.tracer(0, 0) # 关闭动画 # 绘制代码... turtle.update() # 一次性更新画面代码复用能让创作更高效。我把常用的图形封装成函数def filled_star(t, size, color): t.fillcolor(color) t.begin_fill() for _ in range(5): t.forward(size) t.right(144) t.end_fill()调试技巧也很实用。当填充效果不如预期时我会检查图形是否完全闭合确认begin_fill()和end_fill()成对出现尝试简化图形测试基本功能打印当前颜色设置确认值正确6. 创意项目实战经过前面的学习现在可以挑战一些完整的创意项目了。我最喜欢的是画一个完整的自然场景包含太阳、云朵、树木和房子。日出场景结合了多种填充技术# 背景 turtle.bgcolor(skyblue) # 太阳 t.fillcolor(yellow) t.begin_fill() t.circle(50) t.end_fill() # 云朵 def cloud(t, x, y): t.penup() t.goto(x, y) t.pendown() t.fillcolor(white) t.begin_fill() for _ in range(3): t.circle(20, 180) t.right(180) t.end_fill()几何抽象画展示了填充艺术的另一种可能colors [#FF5733, #33FF57, #3357FF, #F333FF] angles [30, 45, 60, 90] for i in range(36): t.fillcolor(colors[i % 4]) t.begin_fill() for _ in range(4): t.forward(100) t.right(angles[i % 4]) t.end_fill() t.right(10)交互式填充让作品更有趣。虽然Turtle的交互功能有限但我们可以实现点击改变颜色def change_color(x, y): t.fillcolor(green if t.fillcolor() red else red) t.begin_fill() t.circle(50) t.end_fill() turtle.onscreenclick(change_color)动画填充效果可以通过逐步绘制实现。比如这个逐渐填充的圆for i in range(1, 11): t.fillcolor(blue) t.begin_fill() t.circle(10 * i) t.end_fill() time.sleep(0.5)7. 从模仿到原创的艺术创作学习Turtle填充艺术的最终目标是发展出自己的创作风格。我建议从模仿开始比如重现名画的简化版然后逐步加入自己的元素。分形图形是展示填充艺术复杂性的好例子。比如这个填充的科赫雪花def koch(t, order, size): if order 0: t.forward(size) else: for angle in [60, -120, 60, 0]: koch(t, order-1, size/3) t.left(angle) t.fillcolor(lightblue) t.begin_fill() for _ in range(3): koch(t, 3, 300) t.right(120) t.end_fill()节日主题作品总是很受欢迎。比如这个填充的圣诞树# 树干 t.fillcolor(brown) t.begin_fill() for _ in range(2): t.forward(40) t.right(90) t.forward(60) t.right(90) t.end_fill() # 树冠 t.fillcolor(darkgreen) positions [(0, 60), (-20, 100), (0, 140)] for x, y in positions: t.penup() t.goto(x, y) t.pendown() t.begin_fill() t.goto(x40, y) t.goto(x20, y60) t.goto(x, y) t.end_fill()文化元素可以增加作品的独特性。比如这个日本国旗# 白色背景 t.fillcolor(white) t.begin_fill() for _ in range(4): t.forward(300) t.right(90) t.end_fill() # 红色圆 t.penup() t.goto(150, -50) t.pendown() t.fillcolor(red) t.begin_fill() t.circle(100) t.end_fill()个人签名作品是最终的创作目标。我建议先构思草图确定颜色方案然后分部分实现。比如这幅数字日落# 渐变背景 colors [#FF7F50, #FF6347, #FF4500, #FF0000] for i, color in enumerate(colors): t.penup() t.goto(-400, -300 i*150) t.pendown() t.fillcolor(color) t.begin_fill() for _ in range(2): t.forward(800) t.right(90) t.forward(150) t.right(90) t.end_fill() # 黑色剪影 t.fillcolor(black) t.begin_fill() # 绘制剪影形状... t.end_fill()