[TOC]
# **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 新增加的。
- 一、Python基礎
- 1. 序言
- 1.1 Python簡介
- 1.2 安裝和使用IDE
- 1.3 語言特性和基礎概念
- 2. 基本數據類型
- 2.2 字符串型
- 2.2.2 ASCII簡介
- 2.2.4 字符串常用函數
- 3. 條件分支
- 3.3 閑聊條件判斷和運算符優先級
- 10.正則表達式
- 【降龍十八章】Python小技巧
- 18.1 學習網址
- 18.2 PIP切換源
- 18.3 使用whl來安裝
- 【工具優化】IDE優化技巧
- Anaconda
- Jupyter Notebook 的 Markdown 添加大綱
- Jupyter Notebook中圖片縮放和居左
- Anaconda設置環境變量
- Pycharm
- PyCharm新建文檔配置
- 設置字體和字號
- 設置主題和字體配色
- 保存和導入配置
- 設置對選擇內容自動添加引號
- 推薦安裝的插件
- Markdown
- 表格格式
- 二、Python進階
- copy和deepcopy
- 《零基礎入門學習 Python 》【小甲魚版】
- 001.和Python的第一次接觸+習題復習
- 002.用Python設計的第一個游戲 +習題復習
- Pygame詳解
- Pygame詳解:前言
- Pygame詳解(一):Color類
- Pygame詳解(二):display 模塊
- Pygame詳解(三):draw 模塊
- Pygame詳解(四):event 模塊
- Pygame詳解(五):font 模塊
- Pygame詳解(六):image 模塊
- Pygame詳解(七):key 模塊
- Pygame詳解(八):locals 模塊
- Pygame詳解(九):mixer 模塊
- Pygame詳解(十):mouse 模塊
- Pygame詳解(十一):Rect 對象
- Pygame詳解(十二):Surface 對象
- Pygame詳解(十三):time 模塊
- Pygame詳解(十四):music 模塊
- Pygame詳解(十五):pygame 模塊
- Pygame詳解(十六):cursors 模塊
- Pygame詳解(十七):joystick 模塊
- Pygame詳解(十八):mask 模塊
- Pygame詳解(二十一):BufferProxy 對象
- Pygame詳解(二十三):gfxdraw 模塊
- Pygame詳解(二十五):Overlay 對象
- Pygame詳解(二十八):sndarray 模塊
- Pygame詳解(三十一):camera 模塊
- Pygame詳解(三十二):cdrom 模塊
- Pygame詳解(三十六):version 模塊
- pygame rect相關知識
- Tkinter詳解
- Tkinter 組件詳解(一):Label
- Tkinter 組件詳解(二):Button