Python 中出现AttributeError: ‘Event‘ object has no attribute ‘key‘

文章描述了在使用《Python编程从入门到实践》一书中的外星人入侵项目时遇到的AttributeError问题。错误出现在尝试访问Event对象的key属性,而Event对象实际上没有这个属性。解决方案是将检查按Q键退出游戏的代码移到正确的事件处理函数中,即将其放在KEYDOWN事件的判断内。
摘要由CSDN通过智能技术生成

《python编程从入门到实践》中在学习外星人入侵项目中运行程序时出现报错 AttributeError: 'Event' object has no attribute 'key'

错误代码如下:

# coding = utf-8

import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """管理游戏资源与行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self)

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()

    def _check_events(self):
        """响应按键和鼠标事件"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:  
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)‘

            #按Q键退出游戏
            elif event.key == pygame.K_q:
                sys.exit()

    def _check_keydown_events(self,event):
        """响应按键"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True

    def _check_keyup_events(self,event):
        """响应松开"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
    
    def _update_screen(self):
        """更新屏幕上的图像,并切换到新屏幕"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()

        pygame.display.flip()

if __name__ == "__main__":
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

运行错误提示

C:\Users\鱼语雨\Desktop\python\python\alien_invasion>python alien_invasion.py
pygame 2.1.2 (SDL 2.0.18, Python 3.10.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "C:\Users\鱼语雨\Desktop\python\python\alien_invasion\alien_invasion.py", line 69, in <module>
    ai.run_game()
  File "C:\Users\鱼语雨\Desktop\python\python\alien_invasion\alien_invasion.py", line 25, in run_game
    self._check_events()
  File "C:\Users\鱼语雨\Desktop\python\python\alien_invasion\alien_invasion.py", line 39, in _check_events
    elif event.key == pygame.K_q:
AttributeError: 'Event' object has no attribute 'key'

导致错误的原因为“ #按Q键退出游戏”这部分程序中“elif event.key == pygame.K_q:”这句语句写在了与 事件类型 “event.type == pygame.KEYDOWN:” 并列的位置上。

“KEYDOWN”和“KEYUP”作为 键盘事件,其提供了一个成员属性key,通过该属性来获取本次键盘事件的内容,及按下了那个按键,所以“event.key”不能与“event.type”处于并列位置。

使用pygame处理事件时,逻辑一般是先判断事件类型,然后在根据不同的事件操作,执行不同的游戏操作,及先判断事件类型,再判断事件内容。

正确代码如下:

# coding = utf-8

import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """管理游戏资源与行为的类"""

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self)

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()

    def _check_events(self):
        """响应按键和鼠标事件"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:  
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

    def _check_keydown_events(self,event):
        """响应按键"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        #按Q键退出游戏
        elif event.key == pygame.K_q:
            sys.exit()

    def _check_keyup_events(self,event):
        """响应松开"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
    
    def _update_screen(self):
        """更新屏幕上的图像,并切换到新屏幕"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()

        pygame.display.flip()

if __name__ == "__main__":
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值