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

Python Turtle时钟项目指针移动后不清空出现螺旋效果解决求助

故障原因
  • 绘制与清除的对象不匹配:你在draw_clock函数内部每次都会新建一个独立的Turtle实例绘制指针,但循环末尾调用的clock.clear()只能清空全局定义的、从未绘制过指针的clock对象内容,所有历史指针轨迹都属于临时创建的未被管理的Turtle实例,永远不会被清除,最终形成螺旋残影。
  • 对象职责混淆:全局的pen对象是用来绘制静态表盘、刻度、数字的,你不能用它来绘制动态指针,也不能清除它的绘制内容,否则会导致表盘消失。
  • 执行顺序错误:当前逻辑为「画新指针→更新画布→休眠→清除空对象」,就算清除对象匹配,也会导致上一秒指针多停留1秒,不符合时钟显示逻辑。
修复方案

调整两处核心逻辑即可解决问题:

  1. 移除draw_clock函数内新建Turtle的代码,直接复用全局的clock对象绘制指针,保证绘制和清除的是同一个对象,且不会影响静态表盘的内容
  2. 调整循环执行顺序为「清除上一秒指针→绘制新指针→更新画布→休眠」

修复后完整可运行代码

import turtle
import time

window = turtle.Screen()
window.bgcolor('beige')
window.tracer(0)

pen = turtle.Turtle()
pen.hideturtle()
pen.speed(0)

# 绘制静态表盘
pen.up()
pen.goto(0, 0)
pen.setheading(90)
pen.penup()
pen.goto(280, 0)
pen.pensize(10)
pen.pendown()
pen.begin_fill()
pen.fillcolor('white')
pen.circle(280)
pen.end_fill()
pen.color("black")
pen.penup()
pen.hideturtle()

# 绘制分钟刻度
for i in range(60):
    pen.penup()
    pen.goto(0, 0)
    pen.pensize(2)
    pen.speed(0)
    pen.forward(250)
    pen.pendown()
    pen.forward(20)
    pen.penup()
    pen.goto(0, 0)
    pen.right(6)

# 绘制小时刻度
for p in range(12):
    turtle.speed(0)
    pen.forward(240)
    pen.pensize(5)
    pen.pendown()
    pen.forward(30)
    pen.penup()
    pen.goto(0, 0)
    pen.right(30)

# 绘制表盘数字
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 190)
pen.write("12", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(220, -30)
pen.write("3", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(0, -240)
pen.write("6", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(-220, -30)
pen.write("9", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(110, 150)
pen.write("1", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(-100, 150)
pen.write("11", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(180, 80)
pen.write("2", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(-170, 80)
pen.write("10", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(180, -140)
pen.write("4", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(-180, -140)
pen.write("8", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(110, -210)
pen.write("5", align="center", font=("Courier", 50, "normal"))
pen.penup()
pen.hideturtle()
pen.goto(-110, -210)
pen.write("7", align="center", font=("Courier", 50, "normal"))

clock = turtle.Turtle()
clock.hideturtle()
clock.speed(0)


def draw_clock(hour, minute, second, pen):
    hands = [("black", 90, 12), ("black", 160, 60), ("black", 120, 60)]
    time_set = (hour, minute, second)
    for x in hands:
        time_part = time_set[hands.index(x)]
        angle = (time_part/x[2])*360
        pen.penup()
        pen.pensize(10)
        pen.goto(0, 0)
        pen.color(x[0])
        pen.setheading(90)
        pen.right(angle)
        pen.pendown()
        pen.forward(x[1])
        pen.penup()


while True:
    hour = int(time.strftime("%I"))
    minute = int(time.strftime("%M"))
    second = int(time.strftime("%S"))
    # 先清除上一秒的指针
    clock.clear()
    # 传入专门画指针的clock对象,不要传入画表盘的pen
    draw_clock(hour, minute, second, clock)
    window.update()
    time.sleep(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:05