Python Pygame窗口的创建与关闭

我们用 turtle 模块绘制图形时,需要一个窗口。使用 Pygame 绘图,同样也需要建立一个窗口。

Python Pygame窗口创建

我们先来创建一个最简单的窗口,代码如下。
import pygame
pygame.init()
windowSurface=pygame.display.set_mode([500,400])

运行这段代码,可以看到一个填充色为黑色的空白窗口,如下图所示。

Python Pygame窗口的建立

代码的第 1 行是一条简单的 import 语句,它导入 pygame 模块,以便我们可以在程序中使用该模块中的函数。实际上,Pygame 所提供的所有那些处理图形、声音以及拥有其他功能的函数,都位于 pygame 模块中。

第2行代码是调用 pygame.init() 函数。每次想要使用 Pygame 的时候,我们都要调用 pygame.init(),而且它总是要放在导入了 pygame 之后,并且要放在调用任何其他的 Pygame 函数之前。

第3行代码调用了 pygame.display.set_mode([500,400]),创建了一个宽 500 像素、高 400 像素的显示窗口,并且返回了用于该窗口的 pygame.Surface 对象,然后将这个对象存储在名为 windowSurface 的变量中。

Surface 对象是表示一个矩形2D图像的对象。我们可以通过调用 Pygame 绘制函数,来改变 Surface 对象的像素,然后再显示到屏幕上。

注意,pygame.display.set_mode() 返回的 Surface 对象叫作显示 Surface(display Surface)。当调用 pygame.display.update() 函数的时候,之前绘制到显示 Surface 对象上的任何内容,都会显示到窗口上。

在一个 Surface 对象上绘制(该对象只存在于计算机内存之中),比把一个 Surface 对象绘制到计算机屏幕上要快很多。这是因为修改计算机内存比修改显示器上的像素要快很多。

Python 程序经常要把多个不同的内容绘制到一个 Surface 对象中。在游戏循环的本次迭代中,一旦将一个 Surface 对象上的所有内容都绘制到了显示 Surface 对象上,这个显示 Surface 对象就会绘制到屏幕上。

Python Pygame窗口关闭

运行代码后,你可能会发现一个问题——这个窗口是无法关闭的。这是为什么呢?

这是因为,Pygame 建立的程序需要检测用户的动作,从而根据用户的操作做出响应。所以 Pygame 有一个事件循环,它会不断检查用户在做什么,比如按下键盘、移动鼠标或者关闭窗口等操作。由于我们还没有加上这个事件循环,所以窗口无法关闭。

下面,我们为程序添加了几行代码(如下突出显示的代码行),让它监控用户的动作。这样,当用户点击关闭按钮时,就会关闭窗口,代码如下。
import pygame
pygame.init()
windowSurface=pygame.display.set_mode([500,400])
Running=True
while Running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Running =False
pygame.quit()

首先我们创建了一个变量 Running,并且将其设置为 True。然后为了保持 Pygame 事件循环一直运行,我们使用 while 循环。当 Running为True 时,循环会一直进行。退出循环的唯一方式是变量 Running为False。

然后,在 while 循环中加入了一个 for 循环,它会遍历 pygame.event.get() 所返回的 Event 对象的列表。Event 对象有一个名为 type 的成员变量,它告诉这个对象表示的是什么类型的事件;而针对 pygame.locals 模块中的每一种可能的类型,Pygame 都有一个常量变量。程序检查 Event 对象的 type 是否等于常量 pygame.QUIT,如果等于,那么我们就知道产生了 QUIT 事件。

当用户关闭程序的窗口或者当计算机关闭窗口并尝试终止所有运行的程序的时候,pygame 模块会产生 QUIT 事件。当程序检测到 QUIT 类型的事件的时候,就会将变量 Running 设置为 False。这时,就会退出 while 循环。

然后,调用 pygame.quit() 函数,它是和 init() 相对应的一个函数,在退出程序之前,需要调用它。然后才能退出 Pygame 并终止程序。

运行以上代码,我们会看到一个正常工作的 Pygame 窗口,当用户点击关闭窗口按钮时,就可以关闭窗口了。

提示:我们通常用大写字母来定义常量变量,是为了说明这种类型的变量的内容是不会轻易改变的,这是一种约定俗成的方式。尽管这些常量变量的值实际上仍然可以被改变。

任何时候,当用户做了诸如按下一个键盘或者把鼠标移动到程序的窗口之上等动作,Pygame 库就会创建一个 pygame.event.Event 对象来记录这个动作,也就是“事件”。我们可以调用 pygame.event.get() 函数来搞清楚发生了什么事件,该函数返回 pygame.event.Event 对象的一个列表。

这 个Event 对象的列表,包含了自上次调用 pygame.event.get() 函数之后所发生的所有事件。通常,我们使用一个 for 循环遍历 Event 对象的列表。在这个for循环的每一次迭代中,会得到 Event 对象列表中的下一个事件对象。

pygame.event.get() 函数所返回的 Event 对象的列表,将会按照事件发生的顺序来排序。如果用户点击鼠标并按下键盘按键,鼠标点击的 Event 对象将会是列表的第 1 项,键盘按键的 Event 对象将会是第 2 项。如果没有事件发生,那么 pygame.event.get() 将返回一个空白的列表。