![零基础入门Python游戏](https://wfqqreader-1252317822.image.myqcloud.com/cover/70/44510070/b_44510070.jpg)
2.5 窗口管理
Pygame中关于窗口管理与屏幕显示的模块主要是pygame.display,本节介绍该模块提供的一些主要函数。
1. 创建窗口
在Hello World示例程序中出现过,创建窗口所使用的函数为
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P34_9717.jpg?sign=1739275682-vEiwK7g5V0bupVuYUCZwae8S8vshhBsj-0-55e5f732fd30e4f0a3ee373f3e2beaf3)
其名称之所以为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窗口的坐标系。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P34_1308.jpg?sign=1739275682-kgeyw56D4szHTOfBLEXhQFMoExfdCd1u-0-445b7cfefa9af69291dac5c5710ed8d2)
图2-5 Pygame窗口坐标系
可见,其坐标原点位于窗口的左上角。
注意:坐标系不包括标题栏。
2. 设置标题
设置标题所使用的函数为
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1326.jpg?sign=1739275682-godFscV7LNMRbR0nSwEAd4ISUKK5HTSq-0-eb6bc00d48cbd74f98a8dbbaad63e744)
其参数title为窗口标题的名称,参数icontitle为窗口最小化时的标题名称。
3. 设置图标
设置图标所使用的函数为
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1334.jpg?sign=1739275682-JuJRRMUpVnXMW9BcP64pNfrFLbc10Yi6-0-bed11ce66da813eaa33cb1d5277cd95a)
参数Surface代表图标所在的Surface。如果没有设置icon,则默认使用Pygame的Logo作为图标。图标图片的最佳尺寸为32×32像素。
创建icon surface的方法与创建image surface的方法相同,如下所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1342.jpg?sign=1739275682-6D5CJR2JegDe62hvlUM2X5bwoIOIQplu-0-9a60eff87be0742b5b159210db3a7506)
这样即可把窗口图标设置为icon.ico。
4. 更新窗口
前面提到过,创建窗口后,上面的内容并不会自动显示,而是需要在所有绘制操作都完成后主动更新屏幕窗口,这样一来,屏幕才可以正常显示。更新屏幕窗口所使用的函数有两个:flip()和update(),这两个函数的功能类似。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1351.jpg?sign=1739275682-EZFn7jrI0tg7Sc7CwrN1QPV2VcByaTTZ-0-3839d7357de8c905078ae45a32578c93)
flip()函数主要用于在双缓冲情况下翻转buffer,以更新屏幕显示。当然,即使当前不是双缓冲情况,flip()函数也可以正常工作,但在这种情况下,flip()函数只是简单地更新了display surface上的全部内容。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1360.jpg?sign=1739275682-EI6q3cM6L4mqUv2g8pXHNP1A6CZ0Fkzz-0-74772e759634876c8d4b8f9ee31a9179)
update()函数与flip()函数的功能类似。首先,update()函数只适用于普通模式下的屏幕更新,即非双缓冲的情况。在这种情况下,使用update()函数与使用flip()函数并没有太大区别;其次,与flip()函数不同的是,update()函数可以通过参数指定屏幕更新的区域,也就是说,update()函数可以只更新某个指定的矩形区域,而不必更新整个屏幕。
因此,尽管flip()函数与update()函数的功能类似,但是它们却各有优缺点,在编写代码时需要根据实际情况酌情选择。
以上便是pygame.display模块中关于窗口管理的一些常用函数,使用时可以直接通过模块名调用,如pygame.display.flip()。