【pygame】event模块

Pygame的event模块管理游戏的事件队列,包括自动处理、获取、等待、检查和清除事件。主要函数有pygame.event.pump()、get()、poll()、wait()等,用于处理如键盘、鼠标、窗口和用户自定义事件。事件处理对于游戏循环至关重要,避免程序假死并确保与系统交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pygame event模块

主要函数

另一位博主的event模块详细中文翻译
pygame.event.pump() — 让 Pygame 内部自动处理事件
pygame.event.get() — 从队列中获取事件
pygame.event.poll() — 从队列中获取一个事件
pygame.event.wait() — 等待并从队列中获取一个事件
pygame.event.peek() — 检测某类型事件是否在队列中
pygame.event.clear() — 从队列中删除所有的事件
pygame.event.event_name() — 通过 id 获得该事件的字符串名字
pygame.event.set_blocked() — 控制哪些事件禁止进入队列
pygame.event.set_allowed() — 控制哪些事件允许进入队列
pygame.event.get_blocked() — 检测某一类型的事件是否被禁止进入队列
pygame.event.set_grab() — 控制输入设备与其他应用程序的共享
pygame.event.get_grab() — 检测程序是否共享输入设备
pygame.event.post() — 放置一个新的事件到队列中
pygame.event.Event() — 创建一个新的事件对象
pygame.event.EventType — 代表 SDL 事件的 Pygame 对象

来自系统的事件都有一个事件类型和对应的成员属性,下边是每个事件类型以及对应的成员属性列表:

事件类型成员属性
QUITnone
ACTIVEEVENTgain, state
KEYDOWNunicode, key, mod
KEYUPkey, mod
MOUSEMOTIONpos, rel, buttons
MOUSEBUTTONUPpos, button
MOUSEBUTTONDOWNpos, button
JOYAXISMOTIONjoy, axis, value
JOYBALLMOTIONjoy, ball, rel
JOYHATMOTIONjoy, hat, value
JOYBUTTONUPjoy, button
JOYBUTTONDOWNjoy, button
VIDEORESIZEsize, w, h
VIDEOEXPOSEnone
USEREVENTcode

函数

pygame.event.pump() 自动处理事件

pump() -> None
让 Pygame 内部自动处理事件。

对于游戏中的每一帧,你都需要通过某种形式去调用事件队列,这将确保你的程序在内部可以与操作系统的其他部分进行交互。如果你不打算使用其他事件函数,那么你应该调用 pygame.event.pump(),允许 Pygame 内部自动处理事件。

如果你的程序始终通过其他 event 模块的函数处理队列中的事件,那么该函数是没必要的

事件队列中的内部处理是非常重要的事情。主窗口可能需要重新绘制或对系统做出响应。如果你太长时间没有调用事件队列,系统可能会认定你的程序已锁定(假死)。

pygame.event.get() 获取事件

get events from the queue
get(eventtype=None) -> Eventlist
get(eventtype=None, pump=True) -> Eventlist
从队列中获取一个事件。
If pump is True (the default), then pygame.event.pump() will be called.
默认调用pygame.event.pump

pygame.event.poll() 从队列中返回并删除一个事件

从队列中获取一个事件。
poll() -> EventType instance
从队列中返回并删除一个事件。

如果事件队列为空,那么会立刻返回类型为 pygame.NOEVENT 的事件。

pygame.event.wait()

等待并从队列中获取一个事件。
wait() -> EventType instance
wait(timeout) -> EventType instance

从队列中返回并删除一个事件。如果队列为空,那么该函数将持续等待直至队列中有一个事件。当程序在等待时,它将保持睡眠状态。这对于希望与其他应用程序共享系统来说,是非常重要的。

pygame.event.peek()

检测某类型事件是否在队列中。
peek(type) -> bool
peek(typelist) -> bool

如果参数指定的类型的事件存在于队列中,返回 True。
如果参数指定多个类型的事件,则只需队列中拥有其中的任何一个事件便返回 True。

pygame.event.clear()

从队列中删除所有的事件。
clear() -> None
clear(type) -> None
clear(typelist) -> None
从队列中删除所有的事件,如果通过参数指定事件的类型,则删除该类型的所有事件。该函数的效果跟 pygame.event.get() 相同,只是没有返回任何东西。当处理完关注的事件后,清空整个队列可以提高一些效率。

pygame.event.event_name() 通过 id 获得该事件的字符串名字。

event_name(type) -> string
Pygame 通过整数 id 代表事件类型。如果你需要将这些类型的事件展示给用户看,那么你需要将它们转换成字符串(一堆数字谁知道你想表示啥?)。该函数将返回事件类型对应的字符串名字。返回值是以单词大写的样式

pygame.event.set_blocked() 控制哪些事件禁止进入队列

set_blocked(type) -> None
set_blocked(typelist) -> None
set_blocked(None) -> None
参数指定的类型的事件均不允许出现在事件队列中。默认是允许所有事件进入队列。多次禁止同一类型的事件并不会引发什么问题。
如果传入 None,则表示允许所有的事件进入队列。

pygame.event.set_allowed() 控制哪些事件允许进入队列

set_allowed(type) -> None
set_allowed(typelist) -> None
set_allowed(None) -> None

参数指定的类型的事件均允许出现在事件队列中。默认是允许所有事件进入队列。多次允许同一类型的事件并不会引发什么问题。
如果传入 None,则表示禁止所有的事件进入队列。

pygame.event.get_blocked() 检测某一类型的事件是否被禁止进入队列

get_blocked(type) -> bool
如果参数指定类型的事件被禁止进入队列,则返回 True。

pygame.event.set_grab()

控制输入设备与其他应用程序的共享。

set_grab(bool) -> None

当你的程序运行在窗口环境中,它将与其他拥有焦点的应用程序分享鼠标和键盘设备的输入。如果你的程序设置事件独占为 True,那么你的程序将锁定所有的输入(不共享给其他程序了)。

最好不要经常独占输入,因为这将阻止用户在操作系统上的其他操作。

pygame.event.get_grab()

检测程序是否共享输入设备。

get_grab() -> bool

当程序独占输入事件时,返回 True。使用 pygame.event.set_grab() 函数控制这一状态。

pygame.event.post()

放置一个新的事件到队列中。

post(Event) -> None

该函数将放置一个新的事件到事件队列的末端。这些事件将最迟被其他队列函数获取。

该函数通常用于放置 pygame.USEREVENT(用户自定义事件)事件到队列中。尽管你可以放置所有类型的事件,但你需要确保为系统事件类型相应的属性传递合适的值。

如果 SDL 事件队列已满,将抛出 pygame.error 异常。

pygame.event.Event()

创建一个新的事件对象。

Event(type, dict) -> EventType instance

Event(type, **attributes) -> EventType instance

根据参数给定的类型创建一个新的事件。dict 参数指定事件的属性以及相应的值。

class pygame.event.EventType

代表 SDL 事件的 Pygame 对象。

pygame.event.EventType.type — SDL event type identifier.

pygame.event.EventType.dict — vent object attribute dictionary

用于代表 SDL 事件的 Pygame 对象。通过 pygame.event.Event() 创建用户自定义事件。EventType 类型并不是直接可以被调用的。EventType 实例对象支持属性赋值和删除。

type

SDL 事件类型标识符。

type -> int

只读。预定义事件标识符是 QUIT 和 MOUSEMOTION 等。对于用于创建的事件对象,这是传递给 pygame.event.Event() 的 type 参数。

dict

事件对象的属性字典。

dict -> dict

只读。事件类型指定的属性。例如,KEYDOWN 事件包含 unicode,key 和 mod 属性。

后记

Pygame 通过事件队列控制所有的时间消息。该模块中的程序将帮你管理事件队列。输入队列很大程度依赖于 pygame 的 display 模块。如果 display 没有被初始化,显示模式没有被设置,那么事件队列就还没有开始真正工作。这时可以使用pygame.fastevent module.

事件队列可以容纳的事件数有上限(标准 SDL 1.2 为 128),当队列变成满的时候,新事件被丢弃。防止丢失事件,尤其是表示退出的输入事件命令,你的程序必须处理每一帧的事件(使用pygame.event.get, pygame.event.pump,pygame.event.wait, pygame.event.peek或 pygame.event.clear) 并处理它们。不处理事件可能会导致系统确定程序已锁定。要加快队列处理速度,请使用pygame.event.set_blocked来限制哪些事件进入队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值