
2.5 窗口管理
Pygame中关于窗口管理与屏幕显示的模块主要是pygame.display,本节介绍该模块提供的一些主要函数。
1. 创建窗口
在Hello World示例程序中出现过,创建窗口所使用的函数为

其名称之所以为set_mode,是因为窗口可以被创建为不同模式,其后面的两个参数用来控制窗口被创建时的模式。
其中,flags的可选值及其含义如下。
·pygame.FULLSCREEN:全屏。
·pygame.DOUBLEBUF:双缓冲,推荐在HWSurface或OpenGL选项打开时使用。
·pygame.HWSURFACE:硬件加速,只在全屏模式下可用。
·pygame.OPENGL:利用OpenGL进行绘制。
·pygame.RESIZABLE:可缩放。
·pygame.NOFRAME:无边框与控件。
flags的值可以通过符号“|”叠加使用。如果没有设置该flags,则在默认情况下,窗口显示是由软件驱动的。
参数depth表示颜色位深,即每个像素用多少位表示,单位为bit。除了特殊情况以外,一般无须专门设置该参数,它会默认选择与当前系统最匹配的depth数值。
该函数的第一个参数size代表所创建的窗口的尺寸,取值为(width,height)的二元组,其返回值为display surface,是一个Surface对象,代表整个窗口所在的显示区域。要想让屏幕上的所有内容都正常显示,则必须首先将这些内容绘制到该display surface,然后更新屏幕。这将会涉及关于Surface的一些操作,本书将在2.6节就此话题进行深入探讨。
图2-5为Pygame窗口的坐标系。

图2-5 Pygame窗口坐标系
可见,其坐标原点位于窗口的左上角。
注意:坐标系不包括标题栏。
2. 设置标题
设置标题所使用的函数为

其参数title为窗口标题的名称,参数icontitle为窗口最小化时的标题名称。
3. 设置图标
设置图标所使用的函数为

参数Surface代表图标所在的Surface。如果没有设置icon,则默认使用Pygame的Logo作为图标。图标图片的最佳尺寸为32×32像素。
创建icon surface的方法与创建image surface的方法相同,如下所示。

这样即可把窗口图标设置为icon.ico。
4. 更新窗口
前面提到过,创建窗口后,上面的内容并不会自动显示,而是需要在所有绘制操作都完成后主动更新屏幕窗口,这样一来,屏幕才可以正常显示。更新屏幕窗口所使用的函数有两个:flip()和update(),这两个函数的功能类似。

flip()函数主要用于在双缓冲情况下翻转buffer,以更新屏幕显示。当然,即使当前不是双缓冲情况,flip()函数也可以正常工作,但在这种情况下,flip()函数只是简单地更新了display surface上的全部内容。

update()函数与flip()函数的功能类似。首先,update()函数只适用于普通模式下的屏幕更新,即非双缓冲的情况。在这种情况下,使用update()函数与使用flip()函数并没有太大区别;其次,与flip()函数不同的是,update()函数可以通过参数指定屏幕更新的区域,也就是说,update()函数可以只更新某个指定的矩形区域,而不必更新整个屏幕。
因此,尽管flip()函数与update()函数的功能类似,但是它们却各有优缺点,在编写代码时需要根据实际情况酌情选择。
以上便是pygame.display模块中关于窗口管理的一些常用函数,使用时可以直接通过模块名调用,如pygame.display.flip()。