Python使用turtle开发俄罗斯方块出现AttributeError无push属性报错
问题原因
- 直接报错原因:代码中调用了
pen.setundobuffer(None)关闭了turtle画笔的撤销缓冲区,而turtle.stamp()方法默认会将盖章操作记录到撤销缓冲区,此时缓冲区为None,调用push方法就触发了AttributeError: 'NoneType' object has no attribute 'push'。 - 潜在逻辑错误1:键盘事件绑定写法错误,
wn.onkeypress(shape.move_left(grid), "a")会在代码执行到该行时直接调用move_left方法,而非按下对应按键时触发,按键控制功能完全失效。 - 潜在逻辑错误2:左右移动的方法中仅清空了旧位置的网格值,没有给新位置赋值对应的颜色值,就算按键触发成功,画面也不会显示方块移动效果。
解决方案
按以下步骤修改代码即可解决报错并完善功能:
- 删掉
pen.setundobuffer(None)这一行,恢复turtle默认的撤销缓冲区即可解决核心报错。如果确实不需要撤销功能,也可以保留该行,在draw_grid函数开头添加pen.undobuffer = []手动初始化缓冲区即可,更推荐直接删除该行。 - 修正键盘事件绑定,使用lambda匿名函数包裹带参数的方法调用,确保只有按键触发时才执行对应逻辑:
# 修改前 # wn.onkeypress(shape.move_left(grid), "a") # wn.onkeypress(shape.move_right(grid), "d") # 修改后 wn.onkeypress(lambda: shape.move_left(grid), "a") wn.onkeypress(lambda: shape.move_right(grid), "d")
- 完善左右移动方法,给新位置的网格赋值颜色,还可额外添加碰撞判断避免移动到已有方块的位置:
def move_left(self, grid): if self.x > 0 and grid[self.y][self.x -1] == 0: grid[self.y][self.x] = 0 self.x -= 1 grid[self.y][self.x] = self.color def move_right(self, grid): if self.x < 11 and grid[self.y][self.x +1] == 0: grid[self.y][self.x] = 0 self.x += 1 grid[self.y][self.x] = self.color
- 可选优化:在
draw_grid函数开头添加pen.clearstamps(-1)清空上一轮的所有盖章,避免重复绘制导致画面重叠、性能下降。
内容的提问来源于stack exchange,提问作者LeeSooHyung
相关产品推荐
相关产品推荐

