You need to enable JavaScript to run this app. Python中turtle库实现的风车动画转速过快如何调整至正常速度
优惠活动
大模型
产品
解决方案
定价
更多

Python中turtle库实现的风车动画转速过快如何调整至正常速度

问题核心原因

你之前修改tracer参数无效的原因:当调用screen.tracer(0)关闭自动刷新后,所有绘制操作需要手动调用update()才会显示,此时tracer的参数(仅控制自动刷新模式下的绘制间隔)完全不会生效,所以修改它不会有任何效果。
转动速度过快的根源:你的代码使用了无间隔的while True死循环,CPU会以最大速度执行「清屏-绘制风车-更新画面-转动角度」的完整流程,没有任何节流限制,所以速度会完全不受控。
额外说明:你设置的t.speed(2)、t2.speed(2)在手动刷新模式下也是无效的,该属性仅控制自动模式下逐步绘制的动画速度,手动刷新时所有绘制操作会一次性完成,不需要保留这两行。

解决方法

方案1:快速修改版(适合临时验证)

直接在死循环中加入时间延迟,控制每轮绘制的间隔即可:

  • 导入time库
  • 在循环末尾添加time.sleep(延迟秒数)
  • (可选)调整每次转动的角度,让转动更顺滑

修改后的完整代码:

import turtle
import time

screen = turtle.Screen()
screen.tracer(0)         

t2 = turtle.Turtle()
t2.forward(50)
t2.setheading(90)
t2.circle(50)

t = turtle.Turtle()

def rectangle() :
    t.penup()
    t.forward(170)
    t.left(90)
    t.pendown()
    t.forward(5)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(10)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(5)

def windmill():
    for i in range(4):
        rectangle()
        t.penup()
        t.goto(0,0)
        t.pendown()

while True:
    t.clear()
    windmill()
    screen.update()
    t.left(5) # 原先是10度,改小后转动更顺滑
    time.sleep(0.03) # 每轮间隔30毫秒,约33帧每秒

速度调整方式:

  • 想要更快:减小time.sleep()的数值,或者增大t.left()的角度
  • 想要更慢:增大time.sleep()的数值,或者减小t.left()的角度

方案2:稳定优化版(避免GUI卡死)

turtle底层基于tkinter的单线程GUI框架,纯死循环会占满CPU,容易导致窗口无响应。更优雅的写法是使用turtle自带的ontimer方法调度定时任务,完全不需要导入time库,也不会卡窗口:
修改后的完整代码:

import turtle

screen = turtle.Screen()
screen.tracer(0)         

t2 = turtle.Turtle()
t2.forward(50)
t2.setheading(90)
t2.circle(50)

t = turtle.Turtle()

def rectangle() :
    t.penup()
    t.forward(170)
    t.left(90)
    t.pendown()
    t.forward(5)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(10)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(5)

def windmill():
    for i in range(4):
        rectangle()
        t.penup()
        t.goto(0,0)
        t.pendown()

def update_frame():
    t.clear()
    windmill()
    screen.update()
    t.left(5)
    # 每隔30毫秒再次执行当前绘制逻辑,实现循环
    screen.ontimer(update_frame, 30)

# 启动第一帧绘制
update_frame()
# 保持窗口持续运行
screen.mainloop()

这里ontimer的第二个参数就是毫秒级的间隔,和方案1的time.sleep()作用一致,调整数值即可控制转速。

内容的提问来源于stack exchange,提问作者Yok Artık

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 09:24:03