Python 海龟图形:键盘绑定功能第一次后不工作

Python 海龟图形:键盘绑定功能第一次后不工作,python,turtle-graphics,Python,Turtle Graphics,我是一个没有经验的Python 3程序员。我根据YouTube上的教程创建了这个游戏,使用了海龟模块,我遇到了一个问题。下面是代码的一部分,我认为问题在于: def missile_status(self): i = 0 if self.status == "firing": while i <= 5: i += 1 turtle.time.sleep(1) if i >= 5:

我是一个没有经验的Python 3程序员。我根据YouTube上的教程创建了这个游戏,使用了海龟模块,我遇到了一个问题。下面是代码的一部分,我认为问题在于:

def missile_status(self):
    i = 0
    if self.status == "firing":
        while i <= 5:
            i += 1
            turtle.time.sleep(1)
    if i >= 5:
        self.status = "ready"

def shoot(self):
    if self.status == "ready":
        self.goto(player_traits.xcor(), player_traits.ycor())
        self.setheading(player_traits.heading())
        self.status = "firing"
        self.st()
def导弹_状态(自身):
i=0
如果self.status==“正在启动”:
当i=5时:
self.status=“就绪”
def喷射(自):
如果self.status==“就绪”:
self.goto(player_traits.xcor(),player_traits.ycor())
self.setheading(player_traits.heading())
self.status=“点火”
self.st()

我将函数
shot
绑定到空格键。当我第一次按下空格键时,它会执行该函数并正常工作。但之后,如果我按空格键再次拍摄(五秒钟后),该函数将无法工作(无法拍摄)。

您可能没有提供足够的代码进行调试,但在turtle这样的事件驱动环境中,任何包含
time.sleep()
的教程都是可疑的。下面是一个完整的、可运行的、简化的示例,说明了我如何处理这个问题。玩家只在一个维度上移动,以保持示例的简单性,但基本思想也应该在两个维度上工作:

from turtle import Screen, Turtle
from functools import partial

class Missle(Turtle):
    def __init__(self):
        super().__init__("circle")

        self.hideturtle()
        self.shapesize(0.5)
        self.setheading(90)
        self.penup()

        screen.onkey(self.shoot, "space")  # enable shooting

    def track_missle(self, milliseconds=5000):
        if milliseconds > 0:
            self.forward(10)
            milliseconds -= 100

            # can't use partial() due to object has no attribute '__name__'
            screen.ontimer(lambda: self.track_missle(milliseconds), 100)
        else:
            self.hideturtle()  # this shot is finished
            screen.onkey(self.shoot, "space")  # reenable shooting

    def shoot(self):
        screen.onkey(None, "space")  # disable further shots for now

        self.goto(player.position())  # shots originate from player's position
        self.showturtle()

        screen.ontimer(self.track_missle, 100)  # move for 5 secs, update every 0.1 sec

class Player(Turtle):
    def __init__(self):
        super().__init__("triangle")

        self.settiltangle(90)  # move side to side but face upward
        self.penup()
        self.sety(-screen.window_height() / 4)

        screen.onkey(partial(self.forward, 10), "Right")
        screen.onkey(partial(self.backward, 10), "Left")

screen = Screen()
player = Player()
missle = Missle()

screen.listen()
screen.mainloop()

您可以演示如何将空格键与函数链接