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

Python Turtle程序运行约10秒后图形界面假死,如何解决?

修复Turtle时钟程序窗口未响应问题

问题根源

  1. 原代码中的无限while循环会完全占用CPU,且该循环位于mainloop()之前执行,导致turtle负责处理窗口交互、用户输入的事件循环根本无法启动,点击窗口时系统会判定程序未响应。
  2. mainloop()语句被放在while循环之后,实际上永远不会被执行到。

修复方案

用turtle自带的ontimer()方法替代阻塞的while循环,让时间更新逻辑以定时任务的方式运行,同时保证事件循环能正常处理窗口交互:

修改后的完整代码

import turtle as trtl
import datetime as tm

# 初始化屏幕和海龟对象
wn = trtl.Screen()
clock = trtl.Turtle()
ct = trtl.Turtle()
ct.ht()  # 隐藏用于写时间的海龟

# 记录上一次显示的时间
previoustime = ""

def drawclock():
    """绘制时钟外框"""
    clock.width(10)
    clock.fd(180)
    clock.lt(90)
    clock.fd(140)
    clock.lt(90)
    clock.forward(320)
    clock.lt(90)
    clock.forward(140)
    clock.lt(90)
    clock.forward(180)
    clock.ht()  # 隐藏绘制外框的海龟

def updateclock(current_time):
    """更新显示的时间"""
    global previoustime
    ct.clear()
    ct.color('red')
    ct.write(current_time, align='center', font=('alarm clock', 96))
    previoustime = current_time

def check_time():
    """定时检查时间并更新"""
    now = tm.datetime.now()
    # 用格式化字符串自动实现分钟补零
    current_time = f"{now.hour}:{now.minute:02d}"
    
    if current_time != previoustime:
        updateclock(current_time)
    
    # 每隔1秒(1000毫秒)再次调用自身,实现持续更新
    wn.ontimer(check_time, 1000)

# 绘制时钟外框
drawclock()
# 启动定时检查任务
check_time()
# 启动事件循环,处理窗口交互
wn.mainloop()

关键修改点

  • 提前创建屏幕对象wn,并将mainloop()作为程序最终的事件循环入口
  • 用ontimer()替代while循环,让时间更新逻辑以非阻塞的定时方式运行
  • 使用f-string格式化时间,更简洁地实现分钟小于10时自动补零
  • 隐藏了不需要显示的海龟对象,优化界面整洁度

修改后,程序既能正常更新时间,窗口也能响应点击、拖动等用户操作,不会再出现未响应的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:55:13