ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python Turtle画图入门:用代码创作第一幅可视化艺术作品

2026/9/10 1:59:20 拓冰建站 浏览量
Python Turtle画图入门:用代码创作第一幅可视化艺术作品 很多刚把Python语法啃完的同学都会有同一个困惑变量、判断、循环都学完了但除了在终端里打印几行文字好像什么都干不了。直到有一次我为了哄家里的小朋友用Python代码画了一朵小花他才第一次意识到原来编程不是冷冰冰的是真的能把脑子里的想法变成看得见的东西。这一课我就带你用Python自带的turtle模块完成你的第一幅艺术作品。这个内容适合学完基础语法、想要做点“有反馈”的练习的新手也适合给小朋友做编程启蒙。我会从一个最简单的例子讲起然后带你把参数改成自己的签名作品。不需要额外安装任何第三方库代码量也很小但能练到循环、函数、随机颜色和坐标思考这些东西在后面的爬虫、数据处理、自动化脚本里一样用得上。1. Python画图这件事为什么值得认真做1.1 从“代码命令行输出”到“代码视觉表达”很多人学编程的最大阻碍不是语法难背而是不知道学完能干嘛。前面几课你大概率写过print(Hello World)也做过成绩判断、九九乘法表但归根到底那些东西在屏幕上只是一行行文字很难给你带来“我居然能创造东西”的成就感。画图就是打破这种枯燥感的最好方式之一。你用代码发出的每一条指令都会立刻变成屏幕上的线条、颜色和形状。哪怕只是让海龟往前走了100像素那种“指令被真实执行”的感觉比打印十个“Hello”都要强得多。对新手来说这种即时反馈非常重要它会帮助你建立“代码如何控制机器”的心智模型你的每一条语句都像在指挥一个听话的机器在海滩上画线。而且用代码画画还有一个特别有意思的点它完全是参数化的。如果你觉得一朵花太小改一个数字就能变成一大朵如果你觉得颜色太单调加一个随机函数就能每次运行都不一样。这种“用逻辑生成美”的过程是纯手工绘画给不了的体验。所以我会说Python入门阶段做一次画图练习比你多刷几十道填空题要有价值得多。1.2 为什么选turtle而不选matplotlib或Pygame很多同学一听到“用Python画图”第一反应是用matplotlib或者想用Pygame做个动画。说实话这两个库都很强但都不太适合作为基础第五课的第一个画图工具。我帮你对比一下工具定位学习成本适合场景turtle标准库自带的海龟绘图极低面向入门教育新手入门、编程启蒙、创意图案matplotlib数据可视化库中高要理解Figure/Axes数据图表、科学绘图Pygame游戏与多媒体库较高要理解事件循环、Surface游戏开发、交互式动画turtle最大的优势就是“开箱即用”。它不需要安装任何额外包你的Python装好就有。它最初源自Logo语言专门为了教孩子学编程而设计所以API设计得特别直观你就是控制一只“海龟”在画布上爬爬过的地方留下线条方向、距离、颜色都能控制。其他库也很棒但你需要先理解一大堆抽象概念比如图像坐标系、画布刷新机制、事件循环这些对初学者来说往往是劝退的原因。选工具这件事我一直很在意能用标准库解决的问题就不要让别人为了跑你的示例去折腾环境。Python基础课的核心目标是理解循环、条件、函数和逻辑控制而不是学会配置某个重量级框架。等到你真正需要做数据图表或者小游戏的时候再用matplotlib和Pygame也不迟而且到那时候你已经有turtle打下来的坐标和循环基础了。2. 环境准备与工具选型2.1 安装Python和第一个画图环境这一节只针对还没装好Python的同学。如果已经能用python --version打印版本号可以直接跳到2.2。去Python官网下载对应操作系统的安装包安装的时候有一个关键选项务必勾选“Add Python to PATH”否则之后在命令行里敲python会提示找不到命令。装完之后打开终端Windows是PowerShell或CMDmacOS是Terminal输入python --version如果出现类似Python 3.11.x的输出就说明安装成功。有些Mac用户会使用系统自带的Python 3需要输入python3而不是python这个看你的环境习惯就好不影响后面的代码运行。编辑器方面我的建议是新手直接用Python自带的IDLE启动后新建一个文件写代码再按F5运行窗口管理非常简单。如果你已经在用VS Code也可以在插件市场安装Python扩展配置好解释器之后同样能运行turtle程序。还有更省事的Thonny专为初学者设计自带代码补全和调试看板装完就能跑。不需要纠结“哪个编辑器最好”能让你最快看到画布弹出来的就是此刻最好的。另外提一句虚拟环境也不是这一课必须的。你只需要一个能运行Python文件的环境就够了。等以后你同时做多个项目需要隔离依赖包时再回过来学python -m venv完全来得及。2.2 打开海龟画布的正确姿势环境准备好之后新建一个文件比如draw.py输入下面这段最最基础的代码import turtle turtle.forward(100) turtle.done()运行后会弹出一个窗口窗口里出现一支“海龟画笔”向右画了一条横线然后窗口停在那里等你关闭。如果你以前只在黑框框里见过Python输出看到这个窗口大概会很惊讶原来Python还能这么玩这里的每一行都可以拆开理解import turtle把海龟绘图库加载进来Python标准库里已经帮我们写好了大部分绘制逻辑。turtle.forward(100)控制海龟向前移动100像素。像素可以理解成屏幕上的最小单位100大概是一个中等线段。turtle.done()让程序进入等待状态保持窗口不自动关闭。这一步很容易漏掉漏掉的话窗口可能一闪而过什么问题都看不到。从这以后你可以试着把数字改成200、500或者把forward改成left(90)再forward(100)看看海龟怎么转弯。这个小游戏就是在帮你建立坐标感屏幕上的方向、距离、角度全部由数字控制。如果你能理解“改数字就是改画面”那后面的内容都会非常顺畅。3. 核心细节解析turtle画图的三板斧3.1 坐标、方向和画笔状态turtle的绘图区域本质上是一张坐标纸默认以画布中心为原点(0, 0)x轴正方向向右y轴正方向向上。海龟初始站在原点头朝右也就是0度方向。你可以想象它是一只真的海龟身后拖着一支笔爬过的地方就会留下痕迹。这里有三组概念必须分清概念常用函数说明移动forward()/backward()相对海龟当前方向前进或后退转向left()/right()/setheading()left/right是相对当前方向转setheading是设置绝对角度画笔状态penup()/pendown()/pensize()/pencolor()抬笔移动时不画线落笔后画线字号和颜色控制线条外观最容易搞混的是相对方向和绝对方向。比如你现在头朝右执行left(90)之后头会朝上但如果再执行一次left(90)头就会朝左而不是继续朝上。如果想直接让海龟朝上不管之前面向哪里用setheading(90)会更稳妥。初学者在画复杂图形时经常越画越歪就是因为只用了left/right忘了当前方向是会被前面指令修改的。画笔状态的管理也很有用。比如你想从画布左下角跳到右上角中途不留下任何线就要先用penup()抬起笔移动到位后再pendown()落笔。这个逻辑在以后做任何图形拼接时都会用到。我现在写代码的习惯是只要图形之间有明确的分块一定会在模块开头penup()定位完成后再pendown()这样画面才不会出现莫名其妙的连线。来看一个最经典的练习——画正方形import turtle t turtle.Turtle() for _ in range(4): t.forward(100) t.left(90) turtle.done()为什么要用循环因为正方形四条边是一样的动作只不过执行了四次。代码里_表示我们不需要循环变量本身只关心循环次数。这种写法在画图时非常常见你可以用它画正三角形、正六边形、任何正多边形。3.2 循环、颜色与随机正方形虽然规矩但离艺术作品还差很远。真正让画面“活”起来的是循环、颜色和随机数一起配合。颜色有两种给法一种是直接用颜色名称比如t.pencolor(red)另一种是用RGB三通道需要先开启turtle.colormode(255)再传三个0到255之间的整数比如(255, 128, 0)是一种橙色。第二种方式更灵活因为可以配合random模块生成随机颜色。我把上面的正方形改成“旋转彩色正方形”先画一个正方形向右旋转10度再画一个循环36次这样就会得到一个齿轮状的图案import turtle import random t turtle.Turtle() t.speed(10) turtle.colormode(255) for i in range(36): t.pencolor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) for _ in range(4): t.forward(100) t.left(90) t.left(10) turtle.done()这段代码的核心是嵌套循环。外层循环控制绘制多少个正方形内层循环负责画一个完整的正方形。每画完一个正方形海龟多左转10度所以下一个正方形会错开一点角度。36次正好是360度最后图形会旋转一圈回到起点附近。随机颜色的体现就是用random.randint(0, 255)每次生成不同颜色。这里注意如果你忘记写turtle.colormode(255)程序运行时通常不会马上报错但颜色会出现异常或者在某些环境下报turtle.TurtleGraphicsError: bad color sequence这是新手最常踩的坑之一。记住这个规则用字符串颜色名不需要colormode用RGB整数一定要在开头设置turtle.colormode(255)。3.3 从直线到曲线画出艺术感的思路只靠直线画出来的图结构上是清晰但总感觉不够柔和。真正的艺术感往往来自曲线。turtle画曲线最简单的办法是用circle(radius, extent)它让海龟沿着半径为radius的圆弧走extent是圆弧的角度。比如t.circle(50, 180)表示画一个半径50像素的半圆弧。理解圆弧后你可以用两个半圆拼出一个花瓣import turtle t turtle.Turtle() t.speed(8) for _ in range(12): t.circle(50, 180) t.left(30) turtle.done()这段代码会让海龟连续画12个半圆每次都左转30度最终形成一个花环。由于半圆起点和终点的方向变化图形会呈现出类似花瓣向外展开的效果。很多看似复杂的艺术图案本质上就是“一个基础形状 旋转重复”。这里不需要高深的数学知识你只需要知道几个关键参数就够了radius越大圆弧越平滑、花瓣越大。extent越大圆弧覆盖的角度越大。每次画完后left()的角度决定了花瓣之间的间距。你可以任意修改这些数字比如把12改成20把180改成120看看画面变成什么样。在turtle的世界里调参本身就是一种创作。我见过很多人第一节课就沉迷于乱调参数然后在电脑前“哇”一声这就是视觉反馈带来的独特魅力。4. 实操过程完成第一幅艺术作品的完整步骤4.1 目标拆解画什么、怎么画接下来我们正式进入“第一幅艺术作品”的制作。为了确保你能完整复现我建议画一个经典又容易出效果的图案星空螺旋。为什么要选螺旋原因有三个代码量极少适合新手完整理解。视觉冲击力强黑色背景下五颜六色的线条不断扩展很像宇宙里的星系。参数空间大只要微调旋转角度就能得到完全不同的图案方便你“改风格”。在动手写代码之前先把目标拆成三块背景把背景设为黑色营造星空感。线条从中心开始不断前进每次前进的距离递增形成螺旋。方向每次前进后向右转91度而不是90度。90度会让图形走回长方形多1度会让轨迹慢慢偏移形成复杂的艺术纹理。这种“拆解目标”的习惯是写代码最值钱的技能。不管以后做爬虫还是做网站拿到一个需求第一件事永远不是写代码而是先想清楚“有哪些输入、哪些输出、中间分几步”。4.2 代码实现与逐行讲解直接给你完整代码先把这份代码运行起来import turtle import random t turtle.Turtle() t.speed(0) turtle.bgcolor(black) turtle.colormode(255) t.pensize(2) for i in range(360): r random.randint(0, 255) g random.randint(0, 255) b random.randint(0, 255) t.pencolor(r, g, b) t.forward(i * 0.6) t.right(91) t.hideturtle() turtle.done()运行之后你会看到窗口里出现一条不断延伸、不断变色的线条最终形成一个像星系一样的螺旋。如果颜色比较刺眼不用急后面我会说怎么改成柔和的渐变。下面逐行解释几个关键点t turtle.Turtle()创建一只海龟。后面所有命令都用t.开头这样代码清晰也能避免多个海龟互相干扰。t.speed(0)设置绘制速度为最快0是特殊值表示不播动画直接出结果。如果电脑性能一般这个大循环也不会太卡。turtle.bgcolor(black)把画布背景设置成黑色。t.pensize(2)画笔粗细设为2像素太细的话在深色背景上不够明显。for i in range(360)循环360次。变量i从0到359既控制循环次数也控制前进距离。t.forward(i * 0.6)每次前进的距离和i成正比。i越大移动距离越远所以整体图案会从中心向外扩散。0.6是缩放系数可以自行调整。t.right(91)这一步是灵魂。向右旋转91度而不是90度会让原本方形的路径不断错开形成螺旋纹理。t.hideturtle()画完后隐藏海龟图标让画面干净。turtle.done()保持窗口不关闭。整份代码一共不到20行但它包含了导入模块、对象调用、循环、随机数、函数、颜色系统等Python基础课的重要知识。你完全可以把它当作一份“用代码表达逻辑”的样例来反复读。4.3 参数调优与美化建议代码能跑只是第一步接下来才是最好玩的调参环节。我强烈建议你把旋转角度改一改每次只改一个参数运行一次看看效果这样能直观感受参数和图形之间的关系。旋转角度效果right(90)形成一个接近矩形的轨迹结构规整但略显单调right(91)经典螺旋线条逐渐偏移艺术感最强right(89)螺旋方向相反视觉上像左旋星系right(120)出现三角形分支结构更接近抽象几何艺术right(100)介于多边形和螺旋之间的混合效果如果你觉得随机颜色太“炸”希望颜色柔和一点可以改用固定颜色列表用取模的方式循环换色import turtle t turtle.Turtle() t.speed(0) turtle.bgcolor(black) t.pensize(2) colors [red, orange, yellow, green, blue, purple] for i in range(360): t.pencolor(colors[i % len(colors)]) t.forward(i * 0.6) t.right(91) t.hideturtle() turtle.done()这里i % len(colors)的意思是取余数当i从0变到5时依次取前6个颜色到i6时余数又变成0重新取红色。这样颜色会呈现出循环渐变视觉上比纯随机更容易接受。更进一步你可以把colors里换成任何喜欢的颜色粉、白、青、金色……黑色星空配上暖色系会很像夕阳下的星轨。另外还可以调整i * 0.6里的系数。0.3会让线条更密更紧凑1.0会让线条更稀疏、张力更大。每次改参数后运行你会慢慢总结出规律数字不是越小越好而是“看你要什么感觉”。这就是我经常说的编程和画画之间的那堵墙其实很薄。5. 常见问题与排查技巧实录5.1 窗口一闪而过怎么办这是turtle入门最常见的问题没有之一。你辛辛苦苦写完代码按运行窗口闪了一下就消失了根本来不及看效果。出现这个现象90%是因为代码末尾缺少turtle.done()或turtle.exitonclick()。解决方法很直接import turtle turtle.forward(100) turtle.exitonclick()turtle.exitonclick()的作用是“点击窗口任意位置再关闭”比turtle.done()更人性化。如果你是双击运行.py文件运行结束后窗口本身就会退出所以一定要确保末尾有类似代码。还有一种情况在IDLE里按F5运行正常但在终端执行python draw.py时窗口闪退。这多半是脚本文件所在目录或文件名有中文乱码或者你当前终端没有等待图形进程结束。先检查文件路径是不是纯英文再确认代码末尾有done相关函数。如果你用的是VS Code运行Python文件后窗口没有弹出可能是你用了右下角“在终端中运行”的方式但turtle窗口被某些显卡驱动截住了。可以试试按F5走调试模式或者在VS Code的终端里手动输入python draw.py通常都能解决。5.2 画布卡顿、颜色不生效卡顿的根源是turtle默认会一步一步刷新动画。当你循环几百次甚至上千次时每画一条线都刷新一次界面自然会很慢。解决方法是把速度设为最快并关闭动画延迟t.speed(0) turtle.delay(0)如果图形特别复杂还可以用“批量绘制再统一刷新”的思路turtle.tracer(0) # ... 画图代码 ... turtle.update()tracer(0)会暂停自动刷新所有绘制完成后调用turtle.update()一次性显示结果。这相当于让系统先专心算画完再给你看速度提升非常明显。初学者可能暂时用不到但如果你是那种喜欢把循环次数改成10000的人记住这个技巧可以救你一命。颜色不生效这个问题我刚才已经说过一次但值得再强调使用RGB整数颜色必须写turtle.colormode(255)。如果忘了你可能会看到颜色特别暗、完全不变色甚至直接报错。报错信息一般是bad color sequence: (123, 45, 67)看到这个就知道是colormode的问题。另外一个容易踩的点是t.color(red)和t.pencolor(red)并不是完全等同。color会同时设置画笔和填充颜色pencolor只设置线条颜色。如果后面要使用填充注意区分。5.3 代码“能跑”但效果不对有些代码执行过程完全正常但画面呈现出来的效果和预期不一致这类问题比报错更让人头疼。最常见的情形是角度和方向搞反了。海龟默认方向朝右left(90)会朝上right(90)会朝下。如果你的图形方向总是反的先检查左右转再检查是否使用了绝对方向setheading()。还有一种情况是图形被屏幕边缘截断。比如你调大了i * 0.6的系数螺旋半径超出画布范围画面看起来就像“缺了一块”。可以用turtle.setup(800, 600)把画布显式设成800x600像素同时把前进系数改小或者把循环次数减少。记住一个原则循环次数越多、单步距离越大图形范围就越大。想画出完整图案要学会控制这两者的比例。最后一种我经常遇到的“怪问题”画完一片空白。这时先检查背景色和画笔颜色是否相同。比如背景是黑色画笔也默认是黑色那无论如何都看不见线条。再检查是否在画图之前误用了t.penup()而忘了t.pendown()。这两个都是非常简单但非常容易忽略的细节。遇到效果不对的问题别急着改几十个参数先用最简单的代码画一条线跑通再逐步加东西。这种“最小化复现”的思路也是以后调试复杂项目时的救命稻草。最后再分享一个小技巧调参的时候不要一个参数一个参数地乱试先把一个明确的数字改成变量比如step i * 0.6然后只改right(91)里的91运行一次看一眼再改回90对比一次。我当年第一次看到91带来的线条偏移时确实有点起鸡皮疙瘩——原来复杂的“艺术作品”也可能是简单规则乘以重复次数得到的。把这个感觉记住你会慢慢爱上用代码造东西的。