Pygame详解(四):event 模块(有USEREVENT事件)
pygame.event
用于处理事件与事件队列的 Pygame 模块。
函数
- 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 对象
Pygame 通过事件队列控制所有的时间消息。该模块中的程序将帮你管理事件队列。输入队列很大程度依赖于 pygame 的 display 模块。如果 display 没有被初始化,显示模式没有被设置,那么事件队列就还没有开始真正工作。
常规的队列是由 pygame.event.EventType 定义的事件对象的组成,有多种方法来访问里边的事件对象:从简单的检测事件是否存在,到直接从栈中获取它们。
所有事件都有一个类型标识符,这个标识符对应的值定义在 NOEVENT 到 NUMEVENTS 之间(温馨提示:类似于 C 语言的宏定义,明白?)。用户可以自行定义事件,但类型标识符的值应该高于或等于 USEREVENT。
获取各种输入设备的状态,推荐你直接通过它们相应的模块(mouse,key 和 joystick)提供的函数访问,而不是通过事件队列; 如果你使用此函数,请记住,Pygame 需要通过一些方式与系统的窗口管理器和平台的其他部分进行通信。为了保持 Pygame 和系统同步,你需要调用 pygame.event.pump() 确保实时更新,你将在游戏的每次循环中调用这个函数。
事件队列提供了一些简单的过滤。通过阻止某些事件进入事件队列,可以略微提高游戏的性能(温馨提示:因为这样事件队列的尺寸就会小一些,所以说可以略微提升性能)。使用 pygame.event.set_allowed() 和 pygame.event.set_blocked() 来控制某些事件是否允许进入事件队列。默认所有事件都会进入事件队列。
事件子系统应该在主线程被调用。如果你希望从其他线程中投递事件消息进入事件队列,请使用 fastevent 包。
Joysticks(游戏手柄)只有在设备初始化后才会发送事件。
一个 EventType 事件对象包含一个事件类型标识符和一组成员数据(事件对象不包含方法,只有数据)。EventType 对象从 Python 的事件队列中获得,你也可以使用 pygame.event.Event() 函数创建自定义的新事件。
由于 SDL 的事件队列限制了事件数量的上限(标准的 SDL 1.2 限制为 128),所以当队列已满时,新的事件将会被扔掉。为了防止丢失事件消息,尤其是代表退出的输入事件(因为当用户点击退出按钮没有反应,往往会被认为“死机”了),你的程序必须定期检测事件,并对其进行处理。
为了加快事件队列的处理速度,可以使用 pygame.event.set_blocked() 函数阻止一些我们不关注的事件进入队列中。
所有的 EventType 实例对象都拥有一个事件类型标识符,属性名是 type。你也可以通过事件对象的 __dict__ 属性来完全访问其他属性。所有其他成员属性的值都是通过事件对象的字典来传递。
在做调试和实验时,你可以打印事件对象以及相应的类型和成员。来自系统的事件都有一个事件类型和对应的成员属性,下边是每个事件类型以及对应的成员属性列表:
事件类型 |
成员属性 |
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 1.9.2 新增加的)
函数详解
pygame.event.pump()
让 Pygame 内部自动处理事件。
pump() -> None
对于游戏中的每一帧,你都需要通过某种形式去调用事件队列,这将确保你的程序在内部可以与操作系统的其他部分进行交互。如果你不打算使用其他事件函数,那么你应该调用 pygame.event.pump(),这将允许 Pygame 内部自动处理事件。
如果你的程序始终通过其他 event 模块的函数处理队列中的事件,那么该函数是没必要的。
事件队列中的内部处理是非常重要的事情。主窗口可能需要重新绘制或对系统做出响应。如果你太长时间没有调用事件队列,系统可能会认定你的程序已锁定(假死)。
pygame.event.get()
从队列中获取事件。
get() -> Eventlist
get(type) -> Eventlist
get(typelist) -> Eventlist
这将获取并从队列中删除事件。如果指定一个或多个 type 参数,那么只获取并删除指定类型的事件。
请注意,如果你只从队列中获取和删除指定的事件,那么久而久之,队列可能被你不关注的事件所填满。
pygame.event.poll()
从队列中获取一个事件。
poll() -> EventType instance
从队列中返回并删除一个事件。
如果事件队列为空,那么会立刻返回类型为 pygame.NOEVENT 的事件。
pygame.event.wait()
等待并从队列中获取一个事件。
wait() -> 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 代表事件类型。如果你需要将这些类型的事件展示给用户看,那么你需要将它们转换成字符串(一堆数字谁知道你想表示啥?)。该函数将返回事件类型对应的字符串名字。返回值是以单词大写的样式(小甲鱼温馨提示:DanCiDaXieDe)。
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 1.9.2 新增加的。
来源:https://blog.csdn.net/qq_41556318/article/details/86303039
Pygame详解(四):event 模块(有USEREVENT事件)相关推荐
- python笔记-Pygame详解(十七):joystick 模块
感谢:来自江南的你 Pygame详解(十七):joystick 模块 #coding:utf-8 import pygame# Define some colors定义一些颜色 BLACK = ( 0 ...
- Pygame详解(十八):mask 模块
pygame.mask Pygame 中处理图形遮罩的模块. 函数 pygame.mask.from_surface() -- 从指定 Surface 对象中返回一个 Mask pygame.ma ...
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- python中yaml模块的使用_详解Python yaml模块
一.yaml文件介绍 yaml是一个专门用来写配置文件的语言. 1. yaml文件规则 区分大小写: 使用缩进表示层级关系: 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元 ...
- Pygame详解:前言
Pygame官网:https://www.pygame.org Pygame的官网是有详细的文档的:https://www.pygame.org/docs/ 下图是Pygame 的所有类和模块,都有对 ...
- Android Studio 插件开发详解四:填坑
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...
- springboot 详解 (四)redis filter
---------------------------------------------------------------------------------------------------- ...
- 数据结构--图(Graph)详解(四)
数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...
- .NET DLL 保护措施详解(四)各操作系统运行情况
我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...
最新文章
- Vbox共享文件夹不显示了
- codeforces round 421 div2 补题 CF 820 A-E
- 单个GPU无法训练GPT-3,但有了这个,你能调优超参数了
- python爬取小说内容_使用python爬取小说全部内容
- Visual Studio 2005结合Direct 9.0 SDK(Aug2007)时应该注意的事项
- vestacp 远程mysql_免费使用VestaCP控制面板的文件管理器 | 雷雨博客
- [bbk2907]第3集 - Chapter 02 - RAC的安装过程中需要注意的要点
- python GIL 全局锁,多核cpu下的多线程性能究竟如何?
- linux下搭建博客day3-git安装
- 【To Understand! 重点 递归 动态规划 正则表达式匹配】LeetCode 44. Wildcard Matching
- MySQL源码—线程篇
- JDK自带的int值的sun.text.IntHashtable
- 读完这篇系列文章,前端offer手到擒来!!!
- 中国天然大豆卵磷脂市场趋势报告、技术动态创新及市场预测
- 全球与中国同心管换热器市场市场需求动态及十四五前景展望研究报告2022~2028年
- 郑州、昆明、韶关等多地全面推行商品房买卖合同电子签约
- NC65开发使用UAP-STUDIO6.5发布WebService
- Python 图片去除背景
- 2005至2022历史路网下载及分析
- 比赛现场气氛营造问题II