Python Turtle模块在while循环中使用计数器时崩溃问题求助
问题成因与修复方案
错误原因
- 变量作用域规则触发的未定义异常
你在函数外部定义了全局变量r,在hello()函数内部执行r +=1这类修改操作时,Python默认会将r判定为函数内部的局部变量,而非读取全局变量。但你没有在函数内部先对局部变量r做初始化赋值,运行时就会抛出UnboundLocalError: local variable 'r' referenced before assignment异常,导致程序崩溃。 - 原始代码崩溃更快的原因
第二段代码在执行r +=1之前,就已经先调用right(r)、forward(r)读取r的值。Python在函数执行前的扫描阶段发现有r +=1的修改操作,就已经将r标记为局部变量,第一次循环到读取r的步骤就会直接报错,比第一段代码运行到r +=1才触发错误的时机更早,所以看起来崩溃速度更快。 - 额外的潜在阻塞问题
你代码中的while True是死循环,会直接占用GUI主线程的所有资源,哪怕解决了变量作用域问题,tkinter.mainloop()事件循环也永远得不到执行,窗口会直接进入无响应状态。
另外补充说明:你原有代码中shapes = [shape("square"), shape("turtle"), shape("triangle")]的写法不符合预期,shape()方法的作用是直接修改当前海龟的形状,返回值为None,因此这个列表中存储的全是空值,如果你需要后续切换海龟形状,应该存储形状名称字符串:shapes = ["square", "turtle", "triangle"],需要切换时再调用shape(shapes[索引])即可。
修复后的可运行代码
from turtle import * import tkinter r = 0 shapes = ["square", "turtle", "triangle"] def hello(): # 声明此处修改的是全局变量r global r right(r) forward(r) left(r) r += 1 # 用turtle自带的定时器实现循环,不阻塞主线程 ontimer(hello, 10) hello() tkinter.mainloop()
内容的提问来源于stack exchange,提问作者Marcus Peterson
相关产品推荐
相关产品推荐

