关闭Python turtle绘图窗口时出现Terminator报错如何解决
异常原因
turtle.Terminator是turtle库内置的终止标识:用户手动关闭绘图窗口时,turtle会在内部标记窗口已销毁,此时如果代码还在执行s.update()这类和窗口交互的绘图操作,就会抛出该异常。你当前代码使用了无退出条件的while True死循环,窗口关闭后循环没有终止,持续调用s.update()就会触发这个报错。
可行解决方案
你可以根据自己的代码场景选以下两种方案:
- 方案1:直接捕获异常终止循环
适配你当前的死循环写法,只需要在循环内捕获turtle.Terminator异常,捕获到后跳出循环即可,修改后代码:import turtle s = turtle.Screen() s.bgcolor('black') obj = turtle.Turtle() while True: try: s.update() except turtle.Terminator: break - 方案2:使用turtle原生主循环替代自定义死循环
这是更符合turtle设计逻辑的写法,不需要自己写无限循环,turtle自带的mainloop()(别名done())会自动维护窗口事件循环,用户关闭窗口时会自动终止进程,不会抛出异常。
如果你需要做手动控制刷新的动画,可以配合tracer(0)关闭自动刷新,再用定时器绑定帧更新逻辑,示例代码:import turtle s = turtle.Screen() s.bgcolor('black') s.tracer(0) # 关闭自动刷新,和你手动调用update的逻辑一致 obj = turtle.Turtle() def frame_update(): # 此处写每一帧的绘图/更新逻辑 obj.right(1) obj.forward(2) s.update() s.ontimer(frame_update, 16) # 约60帧速率刷新 frame_update() s.mainloop() # 启动turtle原生事件主循环
注意:
mainloop()是阻塞方法,要把所有初始化、定时器绑定逻辑写在它调用之前,不要在它之后写自定义死循环,否则会导致窗口无响应。
内容的提问来源于stack exchange,提问作者Sacha Jubinville
相关产品推荐
相关产品推荐

