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

同一程序中多次启动Turtle窗口出现turtle.Terminator错误的解决方案咨询

解决turtle.Terminator错误:多次启动Turtle窗口的正确方式

这个错误的核心原因是你调用了全局的bye()函数——它会直接终止整个turtle依赖的Tkinter主应用程序,导致后续再尝试创建绘图窗口时,底层的GUI环境已经被销毁,自然抛出Terminator异常。

要实现多次独立启动Turtle窗口,同时让代码可以作为模块被其他程序调用,你需要做这几个关键调整:

1. 避免全局turtle实例,使用独立的Screen和Turtle对象

不要用from turtle import *引入全局的绘图实例,而是显式创建每个函数专属的Screen(窗口)和Turtle(画笔),这样每个函数的绘图环境都是完全隔离的。

2. 用屏幕专属的关闭方法替代全局bye()

每个Screen实例有自己的bye()方法,只会关闭当前窗口,不会破坏整个GUI环境,这样后续函数还能正常创建新窗口。

3. 显式启动屏幕的事件循环

turtle的绘图操作依赖Tkinter的事件循环,需要调用screen.mainloop()来确保绘图完成后再处理窗口关闭逻辑。

修改后的完整代码

import turtle

def prvni_chyba():
    # 创建当前函数专属的窗口
    screen = turtle.Screen()
    screen.title('Oběšení')
    
    # 创建专属画笔
    t = turtle.Turtle()
    t.pencolor('blue')
    t.speed(0)
    t.hideturtle()
    
    # 执行绘图逻辑
    t.left(90)
    for i in range(180):
        t.forward(1)
        t.left(1)
    t.left(180)
    t.penup()
    for i in range(90):
        t.forward(1)
        t.right(1)
    
    # 延迟1秒后关闭窗口(确保绘图完成)
    screen.ontimer(screen.bye, 1000)
    # 启动窗口的事件循环
    screen.mainloop()

def druha_chyba():
    screen = turtle.Screen()
    screen.title('Oběšení')
    
    t = turtle.Turtle()
    t.pencolor('blue')
    t.speed(0)
    t.hideturtle()
    
    t.left(90)
    for i in range(180):
        t.forward(1)
        t.left(1)
    t.left(180)
    t.penup()
    for i in range(90):
        t.forward(1)
        t.right(1)
    t.pendown()
    t.left(90)
    t.forward(150)
    
    # 延迟2秒后关闭窗口
    screen.ontimer(screen.bye, 2000)
    screen.mainloop()

# 只有直接运行脚本时才执行测试,作为模块导入时不会自动触发绘图
if __name__ == "__main__":
    prvni_chyba()
    druha_chyba()

额外注意事项

  • 当你的代码作为模块被其他程序导入时,其他程序可以单独调用prvni_chyba()或druha_chyba(),每个调用都会启动独立的绘图窗口,不会互相干扰。
  • 如果不需要延迟关闭窗口,可以把screen.ontimer(screen.bye, 1000)换成screen.exitonclick(),让用户点击窗口后再关闭,这样更友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:23:12