Turtle.onkeypress no funciona (Python)

Soy muy nuevo en Python y he hecho un par de juegos pequeños durante un curso de Python Learning pero nunca en casa. Hace poco comencé a hacer un juego, pero después de solo 10 minutos me topé con un problema:

No sucedió nada cuando presioné “W”, aunque había escrito en keypress en el código. Ver por ti mismo:

(Está diseñado para pantalla completa)

import turtle s = turtle.Screen() g = turtle.Turtle() t = turtle.Turtle() #Ground t.speed(0) t.up() t.goto(-1000,-200) t.down() t.goto(1000,-200) #Player g.speed(0) PlayerX = -600 def moveX(): g.clear() global PlayerX g.up() g.goto(PlayerX,-99) g.down() g.color("Slate Gray") g.begin_fill() g.circle(-50) g.end_fill() PlayerX = PlayerX - 1 turtle.onkeypress(moveX, "w") moveX() 

Por cierto, estoy totalmente consciente de que no he hecho un botón para retroceder.

Junto con el punto de @ doctorlove en la corrección (+1) de agregar listen() para permitir que la ventana reciba eventos de teclado, un par de comentarios:

Primero, haga clic en la ventana con el mouse para activarlo, de lo contrario no responderá al teclado. En segundo lugar, puede ser útil desactivar el controlador de eventos mientras se está en el administrador de eventos y reactivarlo al salir, para evitar problemas si alguien presiona la tecla repetidamente muy rápido.

Aquí está el segundo comentario junto con algunas otras sugerencias de código:

 from turtle import Turtle, Screen screen = Screen() screen.setup(1200, 500) # Ground ground = Turtle() ground.speed('fastest') ground.penup() ground.goto(-1000, -200) ground.pendown() ground.forward(2000) # Player player = Turtle() player.speed('fastest') PlayerX = -600 def moveX(): global PlayerX screen.onkeypress(None, "w") # disable handler in handler player.clear() player.penup() player.goto(PlayerX, -99) player.pendown() player.color("Slate Gray") player.begin_fill() player.circle(-50) player.end_fill() PlayerX -= 1 screen.onkeypress(moveX, "w") # reenable handler screen.listen() moveX() screen.mainloop() # change import & use turtle.mainloop() if Python 2 

No se requiere que mainloop() se ejecute, pero el progtwig se cerrará después de la moveX() inicial moveX() sin él. mainloop() cambia el control al controlador de eventos Tk para que algunos eventos no se activen sin él.

Deberá cambiar onkeypress() a onkey() si se trata de Python 2, así como cambiar la forma en que se invoca mainloop() .

Creo que se llama onkey no onkeypress . También creo que necesitas escuchar (y agregar un mainloop si quieres que se ejecute):

 turtle.onkey(moveX, "w") turtle.listen() moveX() # draw things first turtle.mainloop() 

Es posible que deba volver a visitar los números que está utilizando para asegurarse de que la forma esté en la ventana.