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"
问题排查与修复
错误原因
- 按键符号大小写错误:Tkinter对按键符号的大小写敏感,
onkey方法中传入的"up"不符合要求,必须使用首字母大写的"Up"格式。 - Snake类move方法语法错误:
self.head[0].forward(MOVE_DISTANCE)中,self.head本身就是Turtle对象,不需要加索引[0],否则会触发类型错误。
修复步骤
- 修正按键绑定参数
在main.py中,将所有小写的按键名称改为首字母大写:screen.onkey(game.up, "Up") screen.onkey(game.down, "Down") screen.onkey(game.left, "Left") screen.onkey(game.right, "Right") - 修复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) - 开启屏幕事件监听
在main.py中添加screen.listen(),确保屏幕能接收键盘事件。
额外注意事项
- Turtle库的按键符号必须严格使用首字母大写形式(如
"Up"、"Left"),不能用全小写。 - 按键绑定完成后,必须调用
screen.listen()才能让绑定生效。
内容的提问来源于stack exchange,提问作者Kiran Murtaza
相关产品推荐
相关产品推荐

