【问题标题】:Python event has not Key attributePython 事件没有 Key 属性
【发布时间】:2020-09-28 03:11:19
【问题描述】:

我正在尝试为我的角色移动创建一个程序。这是我的代码

while True:
   for event in pygame.event.get():
       if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if(event.key == K_RIGHT):
            playerPos[0] +=1
    if (event.key == K_RIGHT) and playerPos[0] < MAPWIDTH -1:
        playerPos[0] =+ 1

这是错误

Traceback (most recent call last):
  File "H:\python things\firstgame.py", line 90, in <module>
if (event.key == K_RIGHT) and playerPos[0] < MAPWIDTH -1:
AttributeError: 'Event' object has no attribute 'key'

【问题讨论】:

  • 非常抱歉,这是我的移动代码,所以在游戏中,我按键盘上的向右箭头,角色向右移动。如果他在地图的边缘,它不会让角色再向右移动@Davy M
  • 您也可以将您的两个if 语句组合在一起,例如if(event.type == KEYDOWN) and (event.key == K_RIGHT):
  • 我想你最后的if 声明不应该在那里。相反,您应该将playerPos[0] &lt; MAPWIDTH -1 条件作为上述if 语句的一部分。我猜你不会有event.key,除非event.type == KEYDOWN
  • @JohanL 就是这样!谢谢!!
  • 这会起作用,因为它摆脱了 for 循环之外有问题的 if 语句。

标签: python pygame


【解决方案1】:

如果有人看到这篇文章并遇到同样的问题,我修复了我的错误并最终解决了这个问题。添加了 cmets 以帮助其他人理解

while True:
    #get all the user events
    for event in pygame.event.get():

        #if user wants to quit
        if event.type == pygame.locals.QUIT:
            #and the game close the window
            pygame.quit()
            sys.exit()

        #if a key is pressed
        elif event.type == pygame.locals.KEYDOWN:
            #if right arrow is pressed
            if event.key == K_RIGHT and playerPos[0] < MAPWIDTH - 1:
                #change player's x postion
                playerPos[0] +=1
            if event.key == K_LEFT and playerPos[0] > 0:
                #change player x position
                playerPos[0] -=1
            if event.key == K_UP and playerPos[0] > 0:
                #change players x position
                playerPos[1] -=1
            if event.key == K_DOWN and playerPos[1] < MAPHEIGHT -1:
                #change player x position
                playerPos[1] += 1

【讨论】:

  • for 循环后的代码应该再缩进一级。缩进在 Python 中很重要,因此请确保它是正确的。
【解决方案2】:

我认为问题出在if (event.key == K_RIGHT) and playerPos[0] &lt; MAPWIDTH -1: 位于 forloop 之外,因此该事件没有 key 属性。

forloop 内的事件有一个 key 属性,因为 pygame.event.get(): 将该行移到 forloop 内,这应该可以解决您的问题。

while True:
   for event in pygame.event.get():
       if event.type == QUIT:
            pygame.quit()
            sys.exit()
       elif event.type == KEYDOWN:
            if(event.key == K_RIGHT):
            playerPos[0] +=1
       elif (event.key == K_RIGHT) and playerPos[0] < MAPWIDTH -1:
            playerPos[0] =+ 1

我还建议您将第 87 行和第 88 行合并为一个这样的 elif(event.type == KEYDOWN) and (event.key == K_RIGHT):

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    首先,您必须检查事件的类型。在 pygame 中,只有 KEYDOWNKEYUP 事件具有 key 属性。因此,如果您这样做,它将起作用:

    if event.type == event.KEYDOWN:
        if event.key == event.K_RIGHT:
            playerPos[0] += 1
    

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 2017-04-27
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2019-08-25
      • 1970-01-01
      相关资源
      最近更新 更多