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

Python中turtle函数二次执行报turtle.Terminator错误原因咨询

问题原因及解决方案

错误原因

第一次执行printmaze函数时,末尾的screen.exitonclick()会关闭turtle图形窗口并终止turtle主循环,同时释放turtle相关的底层系统资源。第二次调用函数时,尝试执行turtle.clear()等turtle操作时,由于图形环境已被销毁,无法访问turtle资源,因此抛出turtle.Terminator错误。

修复方案

方案1:将窗口控制逻辑移到函数外部

不在函数内部调用exitonclick(),而是在函数调用后统一处理窗口退出,实现同一个窗口的复用:

import turtle

def printmaze(sizeX, sizeY, walls):
    startX = -300
    startY = 300

    high = (-startX // sizeX) * 2
    width = (startY // sizeY) * 2

    turtle.clear()
    turtle.speed(0)
    turtle.penup()
    turtle.goto(-startX, startY)
    turtle.pendown()
    turtle.goto(-startX, -startY)
    turtle.goto(startX, -startY)

    turtle.setheading(0)
    for i in range(sizeX):
        turtle.penup()
        turtle.goto(startX, startY - high * i)
        for l in range(sizeY):
            if walls[i][l][1] == 1:
                turtle.pendown()
            else:
                turtle.penup()
            turtle.forward(width)

    turtle.right(90)
    for i in range(sizeY):
        turtle.penup()
        turtle.goto(startX + width * i, startY)
        for l in range(sizeX):
            if walls[l][i][0] == 1:
                turtle.pendown()
            else:
                turtle.penup()
            turtle.forward(high)

# 外部创建窗口并控制退出
screen = turtle.Screen()
# 第一次调用
printmaze(10, 10, [[[0,1] for _ in range(10)] for _ in range(10)])
# 第二次调用
printmaze(5,5, [[[1,0] for _ in range(5)] for _ in range(5)])
screen.exitonclick()

方案2:使用面向对象方式,每次创建独立实例

如果需要每次调用函数生成新窗口,可创建专属的Screen和Turtle对象,避免依赖全局turtle实例:

import turtle

def printmaze(sizeX, sizeY, walls):
    startX = -300
    startY = 300

    high = (-startX // sizeX) * 2
    width = (startY // sizeY) * 2

    # 创建新的窗口和画笔实例
    screen = turtle.Screen()
    pen = turtle.Turtle()

    pen.speed(0)
    pen.penup()
    pen.goto(-startX, startY)
    pen.pendown()
    pen.goto(-startX, -startY)
    pen.goto(startX, -startY)

    pen.setheading(0)
    for i in range(sizeX):
        pen.penup()
        pen.goto(startX, startY - high * i)
        for l in range(sizeY):
            if walls[i][l][1] == 1:
                pen.pendown()
            else:
                pen.penup()
            pen.forward(width)

    pen.right(90)
    for i in range(sizeY):
        pen.penup()
        pen.goto(startX + width * i, startY)
        for l in range(sizeX):
            if walls[l][i][0] == 1:
                pen.pendown()
            else:
                pen.penup()
            pen.forward(high)
    
    screen.exitonclick()
    # 关闭窗口后主动释放资源
    turtle.bye()

此方案每次调用都会生成新窗口,不会因之前窗口关闭导致资源访问问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:12:48