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 对象
来自系统的事件都有一个事件类型和对应的成员属性,下边是每个事件类型以及对应的成员属性列表:
事件类型 | 成员属性 |
---|---|
QUIT | none |
ACTIVEEVENT | gain, state |
KEYDOWN | unicode, key, mod |
KEYUP | key, mod |
MOUSEMOTION | pos, rel, buttons |
MOUSEBUTTONUP | pos, button |
MOUSEBUTTONDOWN | pos, button |
JOYAXISMOTION | joy, axis, value |
JOYBALLMOTION | joy, ball, rel |
JOYHATMOTION | joy, hat, value |
JOYBUTTONUP | joy, button |
JOYBUTTONDOWN | joy, button |
VIDEORESIZE | size, w, h |
VIDEOEXPOSE | none |
USEREVENT | code |
函数
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来限制哪些事件进入队列。