Python Turtle模块:Onkeypress循环条件失效异常问题
问题描述
我正在Angela Yu的Python课程里优化一款“过马路”类游戏,添加有限次使用的玩家动作。首先实现Nitro(nitro)——使用即消耗的瞬时速度提升功能:玩家初始nitro为0,每得2分获得1个。
初始代码中,未获得nitro时按空格无反应;但当nitro≥1后,即使nitro被消耗至不足1,仍可无限使用nitro,导致nitro计数显示负数。
我在循环内添加print函数测试,其行为符合预期:仅在nitro≥1时执行,低于1时停止。为何onkeypress函数表现不同?
附代码:
while game_is_on: screen.update() time.sleep(.025) screen.onkeypress(fun=player.move, key='Up') if scoreboard.nitro >= 1: screen.onkeypress(fun=player.nitro, key='space') screen.onkeyrelease(fun=scoreboard.remove_nitro, key='space') car_manager.drive()
问题原因与解决办法
问题核心在于screen.onkeypress和screen.onkeyrelease的绑定逻辑:
- 当
scoreboard.nitro >=1时,你给空格绑定了对应的函数,但绑定一旦生效,后续即使条件不满足(nitro<1),绑定也不会自动解除。所以第一次满足条件后,空格的按键事件就一直有效,哪怕nitro变成负数也能触发。 - 而print函数是每次循环都判断条件才执行,不满足就跳过,所以表现正常。
有两种可行的解决方式:
- 每次循环先解除空格的绑定,再根据条件重新绑定:
while game_is_on: screen.update() time.sleep(.025) screen.onkeypress(fun=player.move, key='Up') # 先清空空格的所有绑定 screen.onkeypress(None, key='space') screen.onkeyrelease(None, key='space') if scoreboard.nitro >= 1: screen.onkeypress(fun=player.nitro, key='space') screen.onkeyrelease(fun=scoreboard.remove_nitro, key='space') car_manager.drive()
- 在触发函数内部加判断,确保只有nitro足够时才执行对应逻辑:
# 修改scoreboard类的remove_nitro方法 def remove_nitro(self): if self.nitro >= 1: self.nitro -= 1 # 更新nitro计数显示 # 修改player类的nitro方法 def nitro(self): if scoreboard.nitro >= 1: # 执行加速逻辑
内容的提问来源于stack exchange,提问作者ElvisJr
相关产品推荐
相关产品推荐

