使用Turtle绑定按键事件

时间:2019-02-28 03:04:20

标签: python python-3.x turtle-graphics key-bindings

我是Python的新手,正在尝试许多不同的项目来学习。我想用Turtle来创建游戏,我在YouTube上找到了这个家伙,他负责重新创建太空侵略者。

我正在使用IDLE和Python3。创建了屏幕和播放器,但是当我按一个键时什么也没有发生。我已经查询了此问题并尝试了很多方法,但是我不确定自己做错了什么。

另一个不寻常的事情是每个功能只运行一次。我在每个函数中都包含了一条打印语句以发现这一点。为什么每个按键事件只运行一次,却没有绑定到我的实际键盘上?

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

2 个答案:

答案 0 :(得分:1)

问题在于这两行代码:

screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')

您不想调用move_left(),而是想在按下键时传递move_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()

当然,您必须记住,当发射炮弹时,您的乌龟指向右边并相应地将其重定向!

答案 1 :(得分:0)

我认为您在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')