Python海龟绘图入门:从零掌握编程核心逻辑与图形化实践
1. 项目概述为什么海龟绘图是Python入门的绝佳起点如果你刚开始接触Python编程面对一堆抽象的语法和概念感到无从下手那我强烈建议你从“海龟绘图”这个看似简单却极其强大的模块入手。这绝不是一个只给小孩子玩的绘图玩具而是一个能让你直观理解编程核心逻辑——顺序、循环、判断——的绝佳沙盒。想象一下你指挥一只小海龟在屏幕上爬行它爬过的轨迹就形成了线条通过控制它的转向、步长和抬笔落笔你就能绘制出从简单直线到复杂分形的一切图形。这种“所见即所得”的编程体验能瞬间将枯燥的代码与生动的视觉反馈连接起来极大地提升学习动力和成就感。我见过太多新手在print(“Hello World”)之后陷入迷茫而turtle模块就像一座桥梁能平稳地将你从“知道语法”渡到“理解逻辑”。通过它你不仅是在画图更是在实践中掌握变量、函数、循环和条件判断的用法。比如当你写出一个循环让海龟重复画正方形时你立刻就理解了for i in range(4)的实际意义。这种学习路径比直接啃算法题或做数据处理要友好和有效得多。无论你的目标是数据分析、Web开发还是自动化脚本从这里打下的坚实基础都将让你受益无穷。2. 环境准备与核心工具解析2.1 搭建你的Python绘图工坊工欲善其事必先利其器。好消息是海龟绘图turtle是Python标准库的一部分这意味着只要你安装了Python它就随时待命无需任何额外安装。对于初学者我推荐从Python官网下载最新稳定版本如Python 3.11进行安装。安装过程中请务必勾选“Add Python to PATH”选项这能让你在命令行中直接调用Python避免后续很多麻烦。至于代码编辑器选择非常多。如果你追求轻量化和纯粹IDLE随Python安装包自带就完全够用它简单直接没有复杂功能干扰。如果你想有更现代的体验VS Code是一个绝佳选择。你只需要安装Python扩展它就能提供智能代码提示、语法高亮和调试功能。配置环境也很简单在VS Code中打开一个文件夹作为项目目录新建一个.py文件在文件右下角选择已安装的Python解释器即可。我个人更推荐VS Code因为它良好的生态能伴随你从入门到精通。注意网络上有些教程会提到安装某些第三方图形库但对于纯turtle学习你不需要pygame或matplotlib。确保你的代码开头是import turtle而不是其他库名。2.2 理解turtle模块的运作核心在开始画第一笔之前我们需要拆解一下turtle模块的核心对象与坐标系这能帮你从“瞎试”变成“有目的地创造”。整个模块的核心是“海龟”对象你可以把它想象成一支有生命的画笔。首先最重要的概念是屏幕坐标系。绘图窗口的中心点是(0, 0)也就是“原点”。水平向右是X轴正方向垂直向上是Y轴正方向。这与数学中的笛卡尔坐标系完全一致。海龟的初始位置就在原点(0, 0)并且朝向正右方0度方向。理解这一点至关重要因为所有移动和转向命令都是基于海龟当前的位置和朝向。海龟有几个关键状态属性位置(x, y)、朝向angle、笔的落下状态pendown()或抬起状态penup()、笔的颜色pencolor()和粗细pensize()。你的所有编程本质上就是在不断更新海龟的这些状态。例如forward(100)是让海龟沿当前朝向移动100像素这改变了它的位置right(90)是让海龟顺时针转90度这改变了它的朝向。将这些基本命令组合起来奇迹就发生了。3. 从零到一掌握基础绘图命令3.1 让你的第一只海龟动起来让我们打开编辑器写下第一行有魔力的代码import turtle。接着我们创建一个海龟对象通常命名为t或my_turtlet turtle.Turtle()。这时一个箭头形状的海龟就会出现在屏幕中央。现在尝试输入以下四行代码并运行import turtle t turtle.Turtle() t.forward(100) # 向前移动100像素 turtle.done() # 保持窗口打开你会看到海龟从中心向右画了一条水平的直线。turtle.done()或turtle.mainloop()是必要的它告诉程序进入事件循环等待用户操作比如关闭窗口否则绘图窗口可能会一闪而过。恭喜你已经完成了第一个绘图程序但这只是开始。让海龟画一个正方形是理解循环的经典入门练习。如果不使用循环代码会是冗长的重复t.forward(100) t.right(90) t.forward(100) t.right(90) t.forward(100) t.right(90) t.forward(100)而使用for循环逻辑瞬间变得清晰简洁for i in range(4): t.forward(100) t.right(90)这段代码的意思是“重复执行4次先前进100步然后右转90度。” 当你运行它一个完美的正方形就出现了。这个例子生动地展示了循环如何将重复劳动抽象化这是编程的核心思想之一。3.2 控制画笔颜色、粗细与移动只会画黑线可不够我们要让作品多彩起来。t.pencolor()函数用于设置画笔颜色。它支持多种格式颜色字符串如“red”,“green”,“blue”,“cyan”,“yellow”,“purple”等。RGB元组如(255, 0, 0)表示红色(0, 255, 0)表示绿色。RGB每个值的范围是0-255。十六进制字符串如“#FF0000”表示红色。你可以这样使用t.pencolor(“blue”)或t.pencolor((0, 0, 255))。设置完颜色后所有后续的移动轨迹都会使用这个颜色。画笔粗细由t.pensize()控制参数是一个数字单位是像素。例如t.pensize(5)会画出很粗的线条。有时我们不想画线只想让海龟移动到另一个位置这时就需要“抬笔”。t.penup()命令让海龟抬起笔移动时不会留下痕迹到达目标位置后再用t.pendown()落笔继续绘画。这在绘制不连续的图形时非常有用比如画一系列分开的点或线段。实操心得在绘制复杂图形前我习惯先用t.penup()和t.goto(x, y)将海龟移动到合适的起始点再用t.pendown()开始画。这比一开始就从原点画起更容易控制整体布局。另外频繁切换颜色和笔粗可能会让代码有点乱建议将绘制特定颜色/粗细图形的代码块封装成函数让主逻辑更清晰。4. 进阶图形绘制循环与函数的艺术4.1 绘制多边形与星形深入理解角度画正方形让你理解了90度那么画等边三角形呢等边三角形的每个内角是60度但海龟转弯时转的是外角。对于任何正多边形海龟每次需要转动的外角度数 360 / 边数。所以画三角形3边时每次转角是360 / 3 120度。我们可以写一个通用的函数来画任意正多边形def draw_polygon(turtle, sides, length): angle 360 / sides for _ in range(sides): turtle.forward(length) turtle.right(angle)调用draw_polygon(t, 6, 80)就能画出一个边长为80的正六边形。通过修改sides参数你可以轻松画出五边形、八边形甚至更多边形。星形是另一个有趣的练习。常见的五角星其每个顶点的转角是144度因为180 - 180/5 144。更通用的画奇数角星如5角、7角、9角星的公式是每次转角 180 - 180 / 角数。你可以尝试用循环画一个五角星并思考如何画空心星需要抬笔移动或填色星用到后面会讲的fill功能。4.2 利用函数封装复杂图案当图形变得复杂时把所有代码都写在主程序里会难以阅读和维护。这时函数是你的最佳伙伴。函数可以将一段完成特定任务的代码打包通过输入参数来控制其行为。例如我们可以创建一个画花朵的函数每朵花瓣可能就是一个旋转绘制的椭圆或弧形。假设我们要画一朵由多个正方形旋转组成的花def draw_square(t, size): for _ in range(4): t.forward(size) t.right(90) def draw_flower(t, petal_count, size): for _ in range(petal_count): draw_square(t, size) # 画一个花瓣正方形 t.right(360 / petal_count) # 旋转一定角度准备画下一个花瓣在主程序中你只需要两行代码t turtle.Turtle()和draw_flower(t, 12, 50)就能画出一朵由12个正方形花瓣组成的绚丽花朵。这种“分而治之”的思想是构建大型复杂程序的基石。通过组合不同的基础图形函数如画三角形、画圆形你可以创造出无限可能的图案。5. 高级技巧色彩填充、动画与事件交互5.1 为图形填充颜色线框图有了如何为它们填充上色呢turtle模块提供了简单的填充机制。填充必须在t.begin_fill()和t.end_fill()之间完成并且在这之间绘制的图形必须是封闭的。填充颜色使用t.fillcolor()设置它和pencolor一样支持颜色字符串、RGB或十六进制格式。一个典型的填充流程如下t.fillcolor(“lightblue”) # 设置填充色 t.begin_fill() # 开始填充 # 绘制一个封闭图形例如圆形 t.circle(50) t.end_fill() # 结束填充图形内部被自动上色需要注意的是画笔颜色pencolor和填充颜色fillcolor是独立的。你可以画一个红色边框、蓝色填充的图形t.pencolor(“red”); t.fillcolor(“blue”)。注意事项begin_fill()和end_fill()必须成对出现。如果忘记写end_fill()程序不会报错但图形不会被填充。更隐蔽的一个坑是如果绘制的路径不是完全封闭的即使首尾点很接近填充也可能会失败或出现异常。确保你的图形绘制逻辑能精确地回到起点。5.2 制作简单动画与响应事件让海龟动起来能极大增加程序的趣味性。turtle模块支持一些简单的动画控制。t.speed()函数可以设置海龟移动的速度参数从1最慢到10最快0表示瞬间移动无动画。设置为较快速度如6在调试时很实用设置为较慢速度如3则适合演示。我们还可以用循环来创造动画效果。例如让一个正方形旋转起来t.speed(5) # 设置一个合适的速度 for i in range(36): # 旋转36次每次10度共360度 draw_square(t, 100) # 调用之前画正方形的函数 t.right(10) # 每次画完海龟自身旋转10度这会产生一个正方形旋转成圆形图案的动画过程。此外turtle可以响应键盘和鼠标事件实现交互。例如让上下左右键控制海龟移动def move_forward(): t.forward(20) def turn_right(): t.right(15) screen turtle.Screen() screen.onkey(move_forward, “Up”) # 按上箭头键前进 screen.onkey(turn_right, “Right”) # 按右键右转 screen.listen() # 开始监听按键事件 turtle.done()通过screen.onclick()函数你还可以让海龟移动到鼠标点击的位置或者触发一个绘图动作。这些交互功能将你的程序从静态展示变成了一个可玩的小工具。6. 经典项目实战绘制递归分形树6.1 理解递归思想与算法设计分形树是展示递归力量的经典案例也是用turtle学习递归的绝佳项目。递归的核心思想是“自我调用”一个函数在其定义中调用自身。对于画树我们可以这样定义画一棵树 画一根树干然后在树干顶端向左和向右分别画两棵小一点的树。我们需要确定递归的几个关键要素递归函数draw_tree(t, branch_len)其中branch_len是当前要画的树枝长度。基线条件递归不能无限进行下去。当树枝长度小于某个最小值比如5时我们不再继续分叉而是画一片叶子比如画一个小点或变个颜色然后返回。这是递归的出口。递归步骤如果树枝长度大于最小值则画当前长度的树干t.forward(branch_len)。在当前位置向右转一个角度如20度然后递归调用draw_tree画右子树但传入的树枝长度要缩短例如乘以0.7。画完右子树后海龟需要回到当前树干顶端。所以要先退回到起点t.backward(branch_len)不对这样会完全退回。更正确的做法是在右转画右子树之前记住当前位置和朝向画完后恢复到这个状态再左转画左子树。6.2 代码实现与深度优化根据以上思路一个基础版本的分形树代码如下import turtle def draw_tree(t, branch_len): if branch_len 5: # 基线条件 # 画树干 t.forward(branch_len) # 画右子树 t.right(20) draw_tree(t, branch_len * 0.7) # 递归调用树枝变短 # 回到树干顶端准备画左子树 t.left(40) # 右转20 左转40 净左转20度 draw_tree(t, branch_len * 0.7) # 递归调用画左子树 # 回到树干顶端的原始朝向 t.right(20) # 退回树干起点 t.backward(branch_len) else: # 画叶子可以用不同的颜色或形状标记 t.pencolor(“green”) t.dot(5) # 画一个直径为5的实心圆点作为叶子 t.pencolor(“brown”) # 恢复树枝颜色 # 初始化 t turtle.Turtle() t.speed(0) # 最快速度 t.left(90) # 让海龟朝上像一棵树 t.penup() t.goto(0, -150) # 从屏幕下方开始画 t.pendown() t.pensize(2) t.pencolor(“brown”) draw_tree(t, 100) # 初始树干长度100 turtle.done()运行这段代码你会看到一棵结构优美的分形树生长出来。递归的每一层都创建了更细的树枝直到满足基线条件。深度优化与个性化随机化让树看起来更自然。可以导入random模块让每次分支的角度和长度缩短比例在一个范围内随机波动例如angle random.randint(15, 25)new_len branch_len * random.uniform(0.6, 0.8)。这样每次运行生成的树都是独一无二的。颜色渐变根据树枝深度递归层数改变颜色。越深的树枝越细可以越绿模拟枝梢的新叶。可以在函数参数中加入一个depth来表示当前深度。添加更多分支不只是二分叉可以尝试三分叉即在树干顶端分出三个方向的小树这会让树冠看起来更茂密。这个项目完美融合了循环、函数、递归、条件判断和turtle绘图命令是检验和提升你综合能力的试金石。我建议你先理解并复现基础版本然后尝试逐一添加上述优化特性观察每一步带来的变化。7. 常见问题排查与性能优化技巧7.1 新手常踩的坑与解决方案在实际操作中你肯定会遇到一些让人困惑的问题。下面我整理了一个速查表涵盖了最常见的情况问题现象可能原因解决方案窗口一闪而过看不到图形缺少turtle.done()或turtle.mainloop()在绘图代码的最后一行加上turtle.done()。海龟没动或者图形没画出来1. 代码有语法错误运行中断。2. 海龟移动距离太小或颜色与背景相同。3. 笔处于penup()状态。1. 检查终端/控制台的错误信息。2. 增加移动距离如forward(200)或设置醒目的画笔颜色。3. 在绘图前调用pendown()。图形画在了奇怪的位置没有理解坐标系。海龟初始在(0,0)朝右。在开始绘图前使用penup()和goto(x, y)将海龟移动到预期起点。填充颜色失败或不完全1. 图形路径没有完全封闭。2.begin_fill()和end_fill()不匹配或遗漏。1. 仔细检查绘图逻辑确保终点精确回到起点。2. 确保填充代码块被这两个函数正确包裹。递归画分形树时程序卡死或报错1. 缺少基线条件导致无限递归。2. 递归深度过大超出默认递归限制。1. 确保递归函数中有if branch_len 5:这样的终止条件。2. 可通过sys.setrecursionlimit(10000)提高递归深度限制但更好的方法是优化算法减少不必要的深度。动画速度太慢默认速度较慢或者图形太复杂。使用t.speed(0)设置为最快速度。对于复杂图形可以考虑先隐藏海龟t.hideturtle()画完后再显示。7.2 提升绘图效率与项目组织建议当图形变得非常复杂比如高递归深度的分形、大量重复图案时你可能会发现绘图速度变慢。除了设置speed(0)还有几个优化技巧追踪控制turtle.tracer(0, 0)可以关闭动画追踪。这意味着海龟的每一步移动都不会实时刷新到屏幕上直到你调用turtle.update()时所有更改会一次性绘制出来。这对于绘制复杂静态图形能带来巨大的速度提升。用法是在开始画之前turtle.tracer(0, 0)画完之后turtle.update()。隐藏海龟使用t.hideturtle()让海龟光标不可见这能稍微提升绘制速度也让最终画面更干净。减少不必要的绘制在调试时如果只想看最终结构可以用penup()跳过一些中间路径的绘制。关于项目组织当你开始做更复杂的turtle项目时比如一个包含多种图案的画廊建议采用模块化的方式将不同的图形绘制功能写成独立的函数放在一个模块文件如shapes.py里。主程序文件如main.py通过from shapes import draw_tree, draw_flower来导入这些函数。使用字典或列表来管理要绘制的图形和它们的参数便于扩展和维护。最后分享一个我常用的调试小技巧在复杂的递归或循环函数中我经常在关键步骤后添加print语句输出海龟的位置t.pos()和朝向t.heading()。这能帮你直观地理解程序的执行流程快速定位逻辑错误。毕竟编程不仅是写代码更是理解和控制代码的行为。海龟绘图以其独特的可视化方式让这个过程变得无比清晰和有趣。

相关新闻

基于中医五行与现代科学的50首养生音乐指南:原理、曲单与实操

基于中医五行与现代科学的50首养生音乐指南:原理、曲单与实操

1. 项目缘起:为什么我们需要“养生音乐”?最近几年,身边越来越多的朋友开始跟我聊起“养生音乐”。起初我有点不以为然,觉得这不就是一些舒缓的轻音乐或者古典乐吗?直到我自己因为长期伏案工作,颈椎和睡眠都…

2026/10/16 0:41:50 阅读更多 →
从时间戳相减到健壮时间段计算:精度、时区与分布式场景实践

从时间戳相减到健壮时间段计算:精度、时区与分布式场景实践

在实际项目中,我们经常需要处理时间序列数据,例如监控指标、用户行为日志或传感器读数。一个核心需求是计算和分析“时间段”,比如用户会话时长、服务响应时间或特定事件的持续时间。很多开发者会直接使用编程语言提供的基础时间差计算&#…

2026/10/13 22:21:51 阅读更多 →
Python高性能Excel解析:Calamine对比Openpyxl,Rust加速数据读取

Python高性能Excel解析:Calamine对比Openpyxl,Rust加速数据读取

1. 项目概述:为什么我们需要一个新的Excel解析库? 如果你用Python处理过Excel文件,尤其是 .xlsx 格式,那么 openpyxl 这个名字你一定不陌生。作为Python生态中处理Excel文件的老牌库,它几乎是很多开发者入门时的首…

2026/10/4 3:51:30 阅读更多 →

最新新闻

Transformer深度学习实战:从注意力机制到多语言模型的核心原理与避坑指南

Transformer深度学习实战:从注意力机制到多语言模型的核心原理与避坑指南

简介:面向深度学习研究者、算法工程师及AI方向学生的Transformer技术指南,以PDF电子书形式呈现,系统梳理了基于注意力机制的神经网络发展脉络。内容从深度学习历史与Transformer分类学切入,深入讲解编码器-解码器架构、序列到序列…

2026/10/16 0:43:26 阅读更多 →
STEAM与RECAP对比分析:VLA模型、CFGRL与RL技术选型指南

STEAM与RECAP对比分析:VLA模型、CFGRL与RL技术选型指南

1. 从两个"RECAP"和"STEAM"的混淆说起第一次看到"STEAM与RECAP对比分析"这个标题,我下意识以为是游戏平台Steam和某个录屏工具的比较。直到翻了一圈资料才反应过来,这里的STEAM和RECAP大概率指向的是两个完全不同的技术语…

2026/10/16 0:43:26 阅读更多 →
矩阵连乘怎么加括号最省?动态规划实现最优括号化

矩阵连乘怎么加括号最省?动态规划实现最优括号化

1. 一个手算的例子:括号位置不同,乘法次数差了9倍1.1 三个矩阵,两种括号,两种代价矩阵连乘问题用一句话讲就是:给一串连乘的矩阵,怎么加括号让计算机少做点乘法。很多初学算法的人第一次看到这个问题都觉得…

2026/10/16 0:43:26 阅读更多 →
DeepSeek本地部署实战:硬件选型、量化配置与Ollama/vLLM避坑指南

DeepSeek本地部署实战:硬件选型、量化配置与Ollama/vLLM避坑指南

简介:面向希望搭建私有AI环境的个人开发者与小型企业,这份PDF图文教程系统讲解在Windows上通过ollama本地部署DeepSeek的完整流程。它解决了官方安装默认占用C盘、命令行操作不直观等痛点,重点覆盖环境变量修改模型存储位置、OLLAMA_HOST与OL…

2026/10/16 0:43:26 阅读更多 →
视频画质量化不求人:PSNR、SSIM、VMAF与实操工具全解析

视频画质量化不求人:PSNR、SSIM、VMAF与实操工具全解析

做视频处理的同学应该都遇到过这种情况:转码完的视频给客户看,客户说画质变差了,你肉眼对着屏幕盯了半天,好像确实有几帧不对劲,但要你说具体差在哪、差了多少,你一时又说不清楚。这种时候,你就…

2026/10/16 0:43:26 阅读更多 →
VMware Tools 10.0.6 在 CentOS 7.9 上的兼容性与手动部署指南

VMware Tools 10.0.6 在 CentOS 7.9 上的兼容性与手动部署指南

简介:本资源是VMware官方发布的Linux版VMware Tools 10.0.6离线安装包(tar.gz格式),专为无法稳定联网的虚拟机环境设计,面向Linux系统管理员、虚拟化运维工程师及高校实验教学人员,解决在线安装失败、源仓库…

2026/10/16 0:42:26 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →