You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Turtle库绘制点状万花尺 代码运行后原地打转如何修复

问题根因

代码核心问题出在draw_dotted_circle函数的状态处理逻辑:函数执行完成后没有将海龟的位置、朝向重置为调用前的初始状态,每次绘制下一个偏移角度的圆时,都会基于上一次绘制结束时的错位状态继续执行,多次偏移叠加后就会出现同位置持续螺旋绘制的异常。

排查步骤
  • 打印每次调用draw_dotted_circle前后的海龟坐标chinky.pos()和朝向chinky.heading(),可确认每次函数执行后,海龟没有回到画布原点,朝向也发生了随机偏移
  • 单独调用一次draw_dotted_circle(100,5)验证,确认单次执行后海龟状态未复位的问题
修复代码

只需要修改draw_dotted_circle函数,在绘制前保存海龟状态,绘制完成后恢复即可,完整修复后的代码如下:

from turtle import Turtle, done
from math import pi, copysign

chinky = Turtle()
colours = ["DeepPink2", "DarkTurquoise", "chartreuse3", "CornflowerBlue"]
j = 0


def draw_spirograph(size_of_gap, radius):
    global j
    for i in range(int(360 / size_of_gap)):
        chinky.color(colours[j])
        if j < 3:
            j += 1
        else:
            j = 0
        draw_dotted_circle(radius, 5)
        chinky.setheading(chinky.heading() + size_of_gap)


def draw_dotted_circle(radius, dot_size):
    # 保存绘制前的海龟状态
    original_pos = chinky.pos()
    original_heading = chinky.heading()
    
    chinky.penup()
    # 重置朝向为0,保证每次画圆的初始朝向一致
    chinky.setheading(0)
    chinky.sety(radius)

    diameter = 2 * radius
    circumference = pi * diameter
    dot_extent = 360 * dot_size / circumference  # diameter to angle

    times_y_crossed = 0
    x_sign = 1

    while times_y_crossed < 2:
        chinky.dot(dot_size)  # draw the dot
        chinky.right(dot_extent)
        chinky.forward(dot_size)

        chinky.right(dot_extent)  # draw the gap
        chinky.forward(dot_size)

        x_sign_new = copysign(1, chinky.xcor())

        if x_sign_new != x_sign:
            times_y_crossed += 1
            x_sign = x_sign_new

    chinky.pendown()
    # 恢复绘制前的海龟状态
    chinky.setpos(original_pos)
    chinky.setheading(original_heading)


chinky.speed("fastest")
draw_spirograph(5, 100)
done()

内容的提问来源于stack exchange,提问作者niharika gadde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:05