Python 乌龟按箭头不动

Python turtle not moving on arrow press

我试图让我的乌龟 (main_ship) 根据用户按下左右箭头键但乌龟没有移动的时间在屏幕底部移动。我以前在制作 Pong 时使用过相同的代码,所以我不确定为什么它不起作用。

import turtle

wn = turtle.Screen()
wn.title("Game")
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)

main_ship = turtle.Turtle()
main_ship.speed(0)
main_ship.shape("turtle")
main_ship.color("green")
main_ship.shapesize(stretch_wid=2, stretch_len=4)
main_ship.penup()
main_ship.goto(0, -290)
main_ship.left(90)

def main_ship_right():
    x = main_ship.xcor()
    x += 20
    main_ship.setx(x)
def main_ship_left():
    x = main_ship.xcor()
    x -= 20
    main_ship.setx(x)

while True:
    wn.update()
    wn.mainloop()

    wn.listen()
    wn.onkeypress(main_ship_right, "Right")
    wn.onkeypress(main_ship_left, "Left")

当我按下箭头键时,没有任何反应,但代码仍在运行并且没有错误消息。

您必须在 mainloop() 之前分配密钥,这 运行 一直到您关闭 window。

您不需要 while True,因为 mainloop() 已经 运行 内部循环。

您可能必须删除 wm.tracer(0),否则您必须 运行 wn.update() 才能刷新 window.

中的元素
import turtle

# --- functions ---

def main_ship_right():
    x = main_ship.xcor()
    x += 20
    main_ship.setx(x)
    wn.update()

def main_ship_left():
    x = main_ship.xcor()
    x -= 20
    main_ship.setx(x)
    wn.update()

# --- main ---

wn = turtle.Screen()
wn.title("Game")
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)

main_ship = turtle.Turtle()
main_ship.speed(0)
main_ship.shape("turtle")
main_ship.color("green")
main_ship.shapesize(stretch_wid=2, stretch_len=4)
main_ship.penup()
main_ship.goto(0, -290)
main_ship.left(90)
wn.update()

wn.listen()
wn.onkeypress(main_ship_right, "Right")
wn.onkeypress(main_ship_left, "Left")

wn.mainloop()

对于这种运动风格,还有另一种实现方式。这个想法是让光标沿其原始方向移动,但使用 settiltangle() 使其看起来像朝上。

这让我们可以使用 forward(20)backward(20) 来移动光标,而不必写:

x = main_ship.xcor()
x += 20
main_ship.setx(x)

非常适合 Space 入侵者风格的游戏,其中玩家面朝上但向侧面移动:

from turtle import Screen, Turtle
from functools import partial

screen = Screen()
screen.title("Game")
screen.bgcolor('black')
screen.setup(width=800, height=600)

main_ship = Turtle('turtle')
main_ship.speed('fastest')
main_ship.color('green')
main_ship.shapesize(stretch_wid=2, stretch_len=4)
main_ship.settiltangle(90)
main_ship.penup()
main_ship.sety(-290)

screen.onkeypress(partial(main_ship.forward, 20), 'Right')
screen.onkeypress(partial(main_ship.backward, 20), 'Left')

screen.listen()
screen.mainloop()

仅适用于 Python 附带的 turtle 库 -- 在线 Python 开发站点通常提供有限的 turtle 实现,不包括 settiltangle().[=16 等方法=]