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

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:左右移动的方法中仅清空了旧位置的网格值,没有给新位置赋值对应的颜色值,就算按键触发成功,画面也不会显示方块移动效果。
解决方案

按以下步骤修改代码即可解决报错并完善功能:

  1. 删掉pen.setundobuffer(None)这一行,恢复turtle默认的撤销缓冲区即可解决核心报错。如果确实不需要撤销功能,也可以保留该行,在draw_grid函数开头添加pen.undobuffer = []手动初始化缓冲区即可,更推荐直接删除该行。
  2. 修正键盘事件绑定,使用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")
  1. 完善左右移动方法,给新位置的网格赋值颜色,还可额外添加碰撞判断避免移动到已有方块的位置:
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
  1. 可选优化:在draw_grid函数开头添加pen.clearstamps(-1)清空上一轮的所有盖章,避免重复绘制导致画面重叠、性能下降。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:42:03