【问题标题】:Python turtle not moving on arrow pressPython海龟在箭头按下时不移动
【发布时间】:2019-08-14 11:12:06
【问题描述】:

我试图让我的海龟(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() 之前分配键。而且您不需要while True,因为mainloop() 一直运行到您关闭窗口为止。
  • 并删除wn.tracer(0),否则你将不得不在每个改变海龟位置的函数中使用wm.update()

标签: python turtle-graphics


【解决方案1】:

您必须在 mainloop() 之前分配键,它会一直运行直到您关闭窗口。

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

您可能必须删除 wm.tracer(0) 或者您必须运行 wn.update() 才能刷新窗口中的元素。

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()

【讨论】:

    【解决方案2】:

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

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

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

    非常适合 Space Invader 风格的游戏,其中玩家面朝上但侧身移动:

    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() 等方法。

    【讨论】:

      最近更新 更多