Turtle库报错_tkinter.TclError及onkey属性缺失问题求助
问题修复方案
第一个报错:_tkinter.TclError: bad event type or keysym "ButtonLeft"
你用onrelease绑定键盘按键是错误的——这个方法是用来绑定鼠标释放事件的,必须传入鼠标按键的标识,比如左键对应<ButtonRelease-1>、右键对应<ButtonRelease-3>。你把键盘的"Left"传入,自然会触发类型不匹配的报错。
如果要绑定键盘按键的释放事件,应该使用turtle.Screen()对象的onkeyrelease方法,而非turtle实例的onrelease。
第二个问题:'Turtle' object has no attribute 'onkey'
onkey是**屏幕对象(Screen)**的专属方法,不是你创建的turtle实例(即变量a)的方法。必须先获取屏幕对象,再调用它的onkey或onkeyrelease方法。
修复后的完整代码示例
import turtle # 创建turtle实例和屏幕对象 a = turtle.Turtle() screen = turtle.Screen() def left(): a.bk(25) def right(): a.fd(25) def up(): a.lt(90) a.fd(25) a.rt(90) def down(): a.rt(90) a.fd(25) a.lt(90) # 用屏幕对象绑定键盘按键(按下时触发) screen.onkey(left, "Left") screen.onkey(right, "Right") screen.onkey(up, "Up") screen.onkey(down, "Down") # 若需要绑定按键释放事件,替换为以下代码 # screen.onkeyrelease(left, "Left") # screen.onkeyrelease(right, "Right") # screen.onkeyrelease(up, "Up") # screen.onkeyrelease(down, "Down") # 启动键盘监听 screen.listen() # 保持窗口运行,避免程序直接退出 turtle.done()
额外注意事项
- 删除原代码中的
while True循环,turtle的事件监听不需要手动写死循环,screen.listen()和turtle.done()会自动处理事件循环逻辑。 - 如果确实需要绑定鼠标释放事件(比如左键松开后执行函数),正确写法是
a.onrelease(left, "<ButtonRelease-1>"),但这和你绑定键盘按键的需求不匹配。
内容的提问来源于stack exchange,提问作者CretaceousCat
相关产品推荐
相关产品推荐

