同一程序中多次启动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
相关产品推荐
相关产品推荐

