![零基础入门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=1738904024-dE6hUHItLq5FyjkaMo3OoW2K0a4J6yR6-0-8ed08d531879119d8e7a41991077c646)
其名称之所以为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=1738904024-EgepXXl0aWF2WrspcHn2MAKV1o11ftDs-0-dd69067a4644af6f83bb270b0ffcdbe2)
图2-5 Pygame窗口坐标系
可见,其坐标原点位于窗口的左上角。
注意:坐标系不包括标题栏。
2. 设置标题
设置标题所使用的函数为
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1326.jpg?sign=1738904024-8PZghl6UkA6wwxQQSLKSqvLLqoRSBUrY-0-ca1deef05afe1d1175dc2c606c65cdf9)
其参数title为窗口标题的名称,参数icontitle为窗口最小化时的标题名称。
3. 设置图标
设置图标所使用的函数为
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1334.jpg?sign=1738904024-w9w6LjbvEfQLNjqPvMxIiCgRm4E4Hdj3-0-07524a8f23283ba4eb0874b991e84a1f)
参数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=1738904024-DUDIaIm1GTIU2p62d7q4J58sOpHC3IGd-0-344acf217de20744f61b3f92f9e32e39)
这样即可把窗口图标设置为icon.ico。
4. 更新窗口
前面提到过,创建窗口后,上面的内容并不会自动显示,而是需要在所有绘制操作都完成后主动更新屏幕窗口,这样一来,屏幕才可以正常显示。更新屏幕窗口所使用的函数有两个:flip()和update(),这两个函数的功能类似。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1351.jpg?sign=1738904024-0w6rCV1Bn2nXl6TIzA9NebanewdzSSeF-0-2cb5e8e30ecf7799c16556348315c2f9)
flip()函数主要用于在双缓冲情况下翻转buffer,以更新屏幕显示。当然,即使当前不是双缓冲情况,flip()函数也可以正常工作,但在这种情况下,flip()函数只是简单地更新了display surface上的全部内容。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P35_1360.jpg?sign=1738904024-WxIDlqTcgRPpE7LGUcYRB5y5gl0G93v7-0-ecb88969fe99925e6e90c139676b514c)
update()函数与flip()函数的功能类似。首先,update()函数只适用于普通模式下的屏幕更新,即非双缓冲的情况。在这种情况下,使用update()函数与使用flip()函数并没有太大区别;其次,与flip()函数不同的是,update()函数可以通过参数指定屏幕更新的区域,也就是说,update()函数可以只更新某个指定的矩形区域,而不必更新整个屏幕。
因此,尽管flip()函数与update()函数的功能类似,但是它们却各有优缺点,在编写代码时需要根据实际情况酌情选择。
以上便是pygame.display模块中关于窗口管理的一些常用函数,使用时可以直接通过模块名调用,如pygame.display.flip()。