Python Turtle程序运行约10秒后图形界面假死,如何解决?
修复Turtle时钟程序窗口未响应问题
问题根源
- 原代码中的无限
while循环会完全占用CPU,且该循环位于mainloop()之前执行,导致turtle负责处理窗口交互、用户输入的事件循环根本无法启动,点击窗口时系统会判定程序未响应。 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
相关产品推荐
相关产品推荐

