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

运行《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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:57:00