事件(另一种输入)
很多程序都需要对“发生的事情”做出反应。比如说:
- 移动或点击鼠标;
- 按键;
- 经过了一定时间。
有另外一类程序,称为事件驱动程 序(event-driven program),它们的做法完全不同。事件驱动程序基本上只是“原地 不动”,什么也不做,等待着有事件发生。一旦事件确实发生,它们就会做出反应, 完成所有必要的工作来处理这个事件。
不断寻找事件的这个特殊循环叫做事件循环(event loop)。
事件循环
为了让一个事件驱动程序“看到”有事件发生,它必须“寻找”这些事件。程 序必须不断地扫描计算机内存中用来指示事件发生的部分。只要程序在运行,就会 反复这样做。
事件队列
只要有人移动或点击了鼠标或者按下了按键,就会发生事件。这些事件去哪里 了呢?事件循环会一直不断地搜索内存的某个部分。内存中存 储事件的部分叫做事件队列(event queue)。
事件队列就是发生的所有事件的列表,这些事件按它们发生的顺序排列。
事件处理器
如果编写一个 GUI 程序或游戏,程序必须知道用户什么时候按下一个按键或者 移动了鼠标。这些按键、点击和移动鼠标都是事件,而且程序必须知道如何应对这 些事件,它必须处理事件。程序中处理某个事件的部分称为一个事件处理器(event handler)。
并不是每一个事件都要处理。在桌面上移动鼠标时,会创建成百上千个事件, 因为事件循环运行得非常快。每一个瞬间(远远不到 1 秒),即使鼠标只是移动了一 点点,也会生成一个新的事件。不过你的程序可能并不关心鼠标的每一个小小的移 动。它可能只关心用户什么时候点击某个部分。
键盘事件
一旦按下键盘上的某个键就做 某件事情。
按键事件
从事件队列得到所有事件的一个列表。for 循环迭代 处理这个列表中的每一个事件,如果看到一个 QUIT 事件,它会将 running 设置为 False,这会导致 while 循环结束,并结束程序。了解到这一点后,现在你应该已经 完全清楚“点击 × 结束程序”代码是如何工作的。
重复按键
在按键一直按下时 生成多个 KEYDOWN 事件。这称为按键重复(key repeat)。你要告诉它开始重复之前等 待多长时间,另外还要指出多长时间重复一次。这些值的单位都是毫秒(千分之一秒)。
事件名和按键名
查找按下的向上或向下箭头时,我们要寻找 KEYDOWN 事件类型以及 K_UP 和 K_DOWN 按键名。
以下是我们将要使用的一些常用事件:
- QUIT
- KEYDOWN
- KEYUP
- MOUSEMOTION
- MOUSEBUTTONUP
- MOUSEBUTTONDOWN
鼠标事件
最常用的 3 类鼠标事件如下:
- MOUSEBUTTONUP
- MOUSEBUTTONDOWN
- MOUSEMOTION
定时器事件
定时器会按固定的间隔生成事件,就像你的闹钟 一样。如果你设好闹钟,并把闹铃打开,每天它都会在固定的时刻响起来。