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

PyCharm中用turtle库开发贪吃蛇游戏遇“bad event type or key”错误

问题:使用Python Turtle开发贪吃蛇时出现_tkinter.TclError: bad event type or keysym "up"错误

在PyCharm中用Python的turtle图形库开发贪吃蛇游戏时,触发了_tkinter.TclError: bad event type or keysym "up"错误,以下是Snake类代码及完整报错堆栈:

Snake类代码

from turtle import Turtle

STARTING_POSITION = [(0, 0), (-20, 0), (-40, 0)]
MOVE_DISTANCE = 20


class Snake:

    def __init__(self):
        self.adding_dots = []
        self.create_snake()
        self.head = self.adding_dots[0]

    def create_snake(self):
        for position in STARTING_POSITION:
            segment = Turtle("square")
            segment.color("white")
            segment.penup()
            segment.goto(position)
            self.adding_dots.append(segment)

    def move(self):
        for moving in range(len(self.adding_dots) - 1, 0, - 1):
            new_x = self.adding_dots[moving - 1].xcor()
            new_y = self.adding_dots[moving - 1].ycor()
            self.adding_dots[moving].goto(new_x, new_y)
        self.head[0].forward(MOVE_DISTANCE)

    def up(self):
        self.head.setheading(90)

    def down(self):
        self.head.setheading(270)

    def left(self):
        self.head.setheading(180)

    def right(self):
        self.head.setheading(0)

报错堆栈

Traceback (most recent call last):
  File "C:\Users\Kiran\PycharmProjects\Day_20\main.py", line 14, in <module>
    screen.onkey(game.up, "up")
  File "C:\Users\Kiran\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 1395, in onkey
    self._onkeyrelease(fun, key)
  File "C:\Users\Kiran\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 686, in _onkeyrelease
    self.cv.bind("<KeyRelease-%s>" % key, eventfun)
  File "C:\Users\Kiran\AppData\Local\Programs\Python\Python310\lib\turtle.py", line 417, in bind
    self._canvas.bind(*args, **kwargs)
  File "C:\Users\Kiran\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1421, in bind
    return self._bind(('bind', self._w), sequence, func, add)
  File "C:\Users\Kiran\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1375, in _bind
    self.tk.call(what + (sequence, cmd))
_tkinter.TclError: bad event type or keysym "up"
问题排查与修复

错误原因

  1. 按键符号大小写错误:Tkinter对按键符号的大小写敏感,onkey方法中传入的"up"不符合要求,必须使用首字母大写的"Up"格式。
  2. Snake类move方法语法错误:self.head[0].forward(MOVE_DISTANCE)中,self.head本身就是Turtle对象,不需要加索引[0],否则会触发类型错误。

修复步骤

  1. 修正按键绑定参数
    在main.py中,将所有小写的按键名称改为首字母大写:
    screen.onkey(game.up, "Up")
    screen.onkey(game.down, "Down")
    screen.onkey(game.left, "Left")
    screen.onkey(game.right, "Right")
    
  2. 修复move方法的错误
    修改Snake类的move方法,移除多余的索引:
    def move(self):
        for moving in range(len(self.adding_dots) - 1, 0, -1):
            new_x = self.adding_dots[moving - 1].xcor()
            new_y = self.adding_dots[moving - 1].ycor()
            self.adding_dots[moving].goto(new_x, new_y)
        self.head.forward(MOVE_DISTANCE)
    
  3. 开启屏幕事件监听
    在main.py中添加screen.listen(),确保屏幕能接收键盘事件。

额外注意事项

  • Turtle库的按键符号必须严格使用首字母大写形式(如"Up"、"Left"),不能用全小写。
  • 按键绑定完成后,必须调用screen.listen()才能让绑定生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:01:20