运行《How to think like a Computer Scientist》turtle示例报Terminator错误如何解决?
错误原因
- turtle模块采用单例模式实现,内部维护了全局运行状态标记。第一次执行
win.bye()关闭窗口后,全局终止标记会被设置为True,后续再尝试创建Turtle对象或Screen对象时,模块检测到终止标记就会直接抛出turtle.Terminator错误 - 将
import turtle放到函数内部无法解决问题,因为Python的模块导入是全局缓存的,重复导入不会重置模块的全局状态
修复方案
方案1(推荐):复用画布和海龟对象
全局仅创建一次画布和海龟对象,每次绘制前清空画布即可,避免重复销毁重建带来的不必要开销。
import time import turtle def show_poly(win, tess): # 绘制前清空上一次的内容 tess.clear() n = int(input("How many sides do you want in your polygon?")) angle = 360 / n for i in range(n): tess.forward(10) tess.left(angle) time.sleep(3) if __name__ == "__main__": win = turtle.Screen() tess = turtle.Turtle() try: # 重复调用绘制逻辑 show_poly(win, tess) show_poly(win, tess) show_poly(win, tess) finally: # 所有操作完成后再统一关闭窗口 win.bye()
方案2(仅适合测试场景):每次关闭后重置全局状态
如果确实需要每次调用都新开独立窗口,可以在每次关闭窗口后手动重置turtle的内部全局状态:
import time import turtle def show_poly(): try: win = turtle.Screen() # 重置终止标记 turtle.Terminator = False tess = turtle.Turtle() n = int(input("How many sides do you want in your polygon?")) angle = 360 / n for i in range(n): tess.forward(10) tess.left(angle) time.sleep(3) finally: win.bye() # 清空全局缓存的画布对象 turtle.Turtle._screen = None show_poly() show_poly() show_poly()
内容的提问来源于stack exchange,提问作者Rohan Bansal
相关产品推荐
相关产品推荐

