Python Turtle时钟项目指针移动后不清空出现螺旋效果解决求助
故障原因
- 绘制与清除的对象不匹配:你在
draw_clock函数内部每次都会新建一个独立的Turtle实例绘制指针,但循环末尾调用的clock.clear()只能清空全局定义的、从未绘制过指针的clock对象内容,所有历史指针轨迹都属于临时创建的未被管理的Turtle实例,永远不会被清除,最终形成螺旋残影。 - 对象职责混淆:全局的
pen对象是用来绘制静态表盘、刻度、数字的,你不能用它来绘制动态指针,也不能清除它的绘制内容,否则会导致表盘消失。 - 执行顺序错误:当前逻辑为「画新指针→更新画布→休眠→清除空对象」,就算清除对象匹配,也会导致上一秒指针多停留1秒,不符合时钟显示逻辑。
修复方案
调整两处核心逻辑即可解决问题:
- 移除
draw_clock函数内新建Turtle的代码,直接复用全局的clock对象绘制指针,保证绘制和清除的是同一个对象,且不会影响静态表盘的内容 - 调整循环执行顺序为「清除上一秒指针→绘制新指针→更新画布→休眠」
修复后完整可运行代码
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
相关产品推荐
相关产品推荐

