Python 使用Turtle绑定按键事件

Python 使用Turtle绑定按键事件,python,python-3.x,turtle-graphics,key-bindings,Python,Python 3.x,Turtle Graphics,Key Bindings,我是Python新手,正在尝试一些不同的项目来学习。我想用乌龟来制作一个游戏,我在YouTube上找到了一个家伙,他走过重建太空入侵者的道路 我正在使用IDLE和python3。屏幕和播放器都被创建了,但是当我按下一个键时什么也没有发生。我查阅了这个问题,尝试了很多方法,但我不确定我做错了什么 另一个不寻常的事情是每个函数只运行一次。为了发现这一点,我在每个函数中都包含了一个print语句。为什么它只运行一次按键事件,而不绑定到我的实际键盘 import turtle #Screen setu

我是Python新手,正在尝试一些不同的项目来学习。我想用乌龟来制作一个游戏,我在YouTube上找到了一个家伙,他走过重建太空入侵者的道路

我正在使用IDLE和python3。屏幕和播放器都被创建了,但是当我按下一个键时什么也没有发生。我查阅了这个问题,尝试了很多方法,但我不确定我做错了什么

另一个不寻常的事情是每个函数只运行一次。为了发现这一点,我在每个函数中都包含了一个print语句。为什么它只运行一次按键事件,而不绑定到我的实际键盘

import turtle

#Screen setup
screen = turtle.Screen()
screen.bgcolor('black')
screen.title("Space Invaders")

#Create player
player = turtle.Turtle()
player.color('blue')
player.shape('triangle')
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)

playerspeed = 15

#Move the player left and right
def move_left():
    x = player.xcor()
    x -= playerspeed
    player.setx(x)
    screen.listen()
    print("Move left.") #for debugging

def move_right():
    x = player.xcor()
    x += playerspeed
    player.setx(x)
    screen.listen()
    print("Move right.") #for debugging

#Create keyboard binding
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()

#Play game
screen.mainloop()

问题在于这两行代码:

screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
您不希望调用
move\u left()
,您希望在按键时传递事件处理程序调用的
move\u left

screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
通过包含括号,可以传递
move_left()
的返回值,即
None
,从而有效地禁用事件而不是启用它

下面是使用上述修复程序和另一个技巧对代码进行的修改:太空入侵者类型的游戏非常适合利用很少使用的
turtle.settiltangle()
方法。这种方法允许我们使海龟看起来是垂直指向,而实际上是水平指向。因此,我们可以简单地使用
forward()
backward()
在屏幕上移动它:

from turtle import Screen, Turtle

PLAYER_SPEED = 15

# Move the player left and right
def move_left():
    player.backward(PLAYER_SPEED)

def move_right():
    player.forward(PLAYER_SPEED)

# Screen setup
screen = Screen()
screen.bgcolor('black')
screen.title("Space Invaders")

# Create player
player = Turtle('triangle')
player.speed('fastest')
player.color('blue')
player.penup()
player.sety(-250)
player.settiltangle(90)

# Create keyboard binding
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
screen.listen()

# Play game
screen.mainloop()

当然,你必须记住,当你发射一枚炮弹时,你的乌龟正指向正确的方向,并相应地改变它的方向

我想你在YouTube上找到的那个家伙可能使用的是python 2.7,而不是python 3,后者会改变按键命令

而不是

screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()
你应该使用

screen.listen()
screen.onkeypress(move_left, 'Left')
screen.onkeypress(move_right, 'Right')