Your problem is the fact that you're only looking at KEYDOWN events.
What you need to do is toggle a boolean value when a key is pressed or released.
Something like this would work:
# event loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN: # check for key presses
if event.key == pygame.K_LEFT: # left arrow turns left
pressed_left = True
elif event.key == pygame.K_RIGHT: # right arrow turns right
pressed_right = True
elif event.key == pygame.K_UP: # up arrow goes up
pressed_up = True
elif event.key == pygame.K_DOWN: # down arrow goes down
pressed_down = True
elif event.type == pygame.KEYUP: # check for key releases
if event.key == pygame.K_LEFT: # left arrow turns left
pressed_left = False
elif event.key == pygame.K_RIGHT: # right arrow turns right
pressed_right = False
elif event.key == pygame.K_UP: # up arrow goes up
pressed_up = False
elif event.key == pygame.K_DOWN: # down arrow goes down
pressed_down = False
# NowIn your game loop, check for key states:
if pressed_left:
x -= x_speed
if pressed_right:
x += x_speed
if pressed_up:
y -= y_speed
if pressed_down:
y += y_speed
This way, you're actually looking at both presses and releases, and moving while the key is pressed.