Python turtle实现康威生命游戏触发Terminator报错求助
问题排查结论
turtle.Terminator是turtle库的内置终止异常,你遇到这个问题核心是三个原因:
- 你一次性创建25*25共625个独立的Turtle方块实例,turtle默认每执行一次绘图/移动操作就立刻刷新屏幕,大量实例同时执行移动操作时会导致内部更新计数溢出,要是启动时不小心点到窗口、或者窗口没正常加载完成,就会直接抛出这个异常终止程序。
- 如果之前运行代码时turtle窗口异常退出,后台残留了Python的turtle进程,也会导致下次启动时直接抛这个错,遇到这种情况打开任务管理器把残留的Python进程结束掉再运行即可。
- 代码里还有两个隐藏小bug:
- 用
eval(f"({x},{y})")生成坐标元组完全没必要,eval会直接执行传入的字符串,写不好很容易触发安全问题或者语法错误,直接存(x,y)元组就行。 - 内层循环结束后你把x重置成了
0-300也就是-300,但初始x值是-500,这会导致从第二行开始所有格子整体右移200像素,画出来的网格是错位的。
- 用
修复方法
- 创建屏幕之后立刻关闭实时动画刷新,等所有方块都创建、移动到对应位置后再一次性刷新屏幕,既能避免刷新溢出导致的Terminator异常,还能大幅提升运行速度,保证程序持续运行不中断。
- 去掉多余的
eval写法,修正坐标重置的数值错误。 - 后续做生命游戏迭代更新的时候,遵循「先算完所有细胞状态、改完所有格子颜色,再统一调用update刷新」的逻辑,就不会出现卡顿或者异常退出的问题。
修复后的可运行基础代码如下:
import turtle import random START_POSITION = [] def ReStart(): global START_POSITION START_POSITION.clear() y = 500 x = -500 for i in range(25): for a in range(25): # 直接存储坐标元组,不需要用eval START_POSITION.append((x, y)) x += 20 # 重置x为初始值-500,修正网格错位问题 x = -500 y -= 20 return True ReStart() screen = turtle.Screen() # 关闭实时刷新,是解决异常、提升流畅度的核心配置 screen.tracer(0) class Cell: def __init__(self): self.cells = [] self.make_body() # 所有元素创建完成后统一刷新一次屏幕 screen.update() # 你自己实现的a()、Alive()方法可以在这之后正常调用 # self.a() # self.Alive(screen) def make_body(self): global START_POSITION for i in START_POSITION: seg = turtle.Turtle(shape="square") seg.color("White") seg.penup() seg.goto(i[0], i[1]) self.cells.append(seg) if __name__ == "__main__": cell = Cell() # 启动turtle主事件循环,保持窗口持续运行不自动关闭 screen.mainloop()
额外小建议
你11岁就能自己参考资料写康威生命游戏已经非常厉害,后面写迭代逻辑的时候注意两个点:
- 不要每改一个细胞的颜色就刷新屏幕,一定要等一整代所有细胞的状态都算完、颜色都改完,再调用一次
screen.update(),哪怕几百个格子运行起来也会非常流畅。 - 尽量不要用
global传参,可以把START_POSITION作为参数传给Cell类,代码逻辑会更清晰,不容易出现变量被意外改乱的问题。
内容的提问来源于stack exchange,提问作者P6A08李倬霖
相关产品推荐
相关产品推荐

