Python Turtle绘制赫斯特圆点图案:循环漏画最后点的问题排查
问题原因分析
你的代码漏画最后一个点,核心是循环内的操作顺序搞反了:当前逻辑是先画点,再移动到下一个位置,导致每一行的最后一个位置(最右侧)只完成了移动,没有执行画点操作。
具体来看内层循环的执行流程(以第一行为例):
- 初始位置是
(-200, -200),x=-200 - 第1次循环(xax=0):先在当前位置画点,然后移动到
x=-200(原地不动),x变为-150 - 第2次循环(xax=1):在当前位置(还是
-200,-200)画点,然后移动到x=-150,x变为-100 - ...
- 第10次循环(xax=9):在
x=200,-200的位置画点,然后移动到x=250,-200,x变为300 - 内层循环结束,此时tim已经移动到
250,-200,但这个位置没有画点
当所有行循环完成后,tim停在最后一行的最右侧位置250,250,但同样没有画点,这就是你漏画最后一个点的原因。
修复方案
调整循环内的操作顺序,先移动到目标位置,再画点,同时优化初始位置的设置逻辑,避免重复操作:
import turtle as t import random tim = t.Turtle() screen = t.Screen() color_list = [(202, 164, 110), (240, 245, 241), (236, 239, 243), (149, 75, 50), (222, 201, 136), (53, 93, 123), (170, 154, 41), (138, 31, 20), (134, 163, 184), (197, 92, 73), (47, 121, 86), (73, 43, 35), (145, 178, 149), (14, 98, 70), (232, 176, 165), (160, 142, 158), (54, 45, 50), (101, 75, 77), (183, 205, 171), (36, 60, 74), (19, 86, 89), (82, 148, 129), (147, 17, 19), (27, 68, 102), (12, 70, 64), (107, 127, 153), (176, 192, 208), (168, 99, 102)] t.colormode(255) tim.speed("fastest") tim.penup() # 全程不需要pendown,因为dot()不需要画笔落下 tim.hideturtle() x = -200 y = -200 for yax in range(10): tim.setpos(x, y) # 先移动到当前行的起始位置 for xax in range(10): tim.dot(20, random.choice(color_list)) # 在当前位置画点 tim.forward(50) # 移动到下一个点的位置 y += 50 screen.exitonclick()
优化说明
- 去掉了冗余的
pendown()/penup():turtle.dot()方法不需要画笔处于落下状态,全程保持penup()即可 - 用
tim.forward(50)替代手动修改x坐标再setpos,逻辑更直观 - 先移动到目标位置再画点,确保每个位置都被覆盖,不需要额外补画最后一个点
内容的提问来源于stack exchange,提问作者Savi
相关产品推荐
相关产品推荐

