导图社区 Python高级应用思维导图
Python作为一门叫做ABC语言的替代品,提供了高效的高级数据结构,还能简单有效地面向对象编程。下图内容有GUI界面编程、Pygame游戏编程,收藏下图学习吧!
编辑于2021-06-30 15:25:33PY第三阶段高级应用:一
GUI界面编程
GUI
概念:Graphical User Interface图形用户界面,GUI是与程序交互的一种不同方式。
GUI程序三要素
输入
处理
输出
GUI开发工具
TKinter
链接:https://docs.python.org/3/library/tk.html
简介:Tkinter Python 的标准 Tk GUI 工具包的接口,可以在大多数的 Unix 平台下使用, 同样可以应用在 Windows 和 Mac 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
优点:是python的内置库,无需额外下载,不存在兼容问题,且又非常详细的说明文档
缺点:实现效果较为普通
wxPython
链接:https://www.wxpython.org
简介:wxPython是一个创建桌面GUI应用的跨平台工具包(toolkit),它的主要开发者是Robin Dunn。使用wxPython,开发者可以在Windows、Mac和多种Unix系统上开发应用程序
优点:是一个免费的,可移植的GUI类库,用C++编写,可在Windows,Mac OS X,GTK,X11等许多平台上使用。可用于多种语言,包括Python,Perl,Ruby等
缺点:设计的界面美观程度和灵活性较为普通
PyQT
链接:https://docs.python.org/3/library/tk.html
简介:PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。 PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏
优点:功能非常强大,可以用PyQt5开很漂亮的界面;另外它支持可视化界面设计,对新手非常友好。什么意思呢,就是你可以通过拖动一些模块就可以完成一些代码才能完成的工作,就跟C++的QT是一样的
缺点:学习起来有一定难度
PyGtk
链接:https://docs.python.org/3/library/tk.html
优点:跟PyQt一样,可以实现很不错的效果,但是稍逊于PyQt,并且同样有UI设计工具Glade
缺点:更适合GNOME平台
Kivy
链接:https://kivy.org/#home
简介:Kivy 是一个开源的 Python 框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等。 Kivy 可以运行于 Windows, Linux, MacOS, Android, iOS 等当前绝大部分主流桌面/移动端操作系统
优点:Kivy 基于 Python,界面文件和程序文件相互分离的设计思路,设计简洁优雅,语法易学,适合新人入门
缺点:缺点只有一个中文文档还是特别全面,大多数教程还是英文版本
FLTK
链接:https://pyfltk.sourceforge.io/
简介:一个致力于跨平台,快速开发,轻量化和容易使用的python GUI工具
缺点:中文资料极为罕见
OpenGL
链接:https://pypi.org/project/PyOpenGL/
简介:OpenGL 是 Open Graphics Library 的简写,意为“开放式图形库”,是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL 不是一个独立的平台,因此,它需要借助于一种编程语言才能被使用。C / C++ / python / java 都可以很好支持 OpengGL
优点:功能极为强大,几乎可以做出任何2D,3D图形
缺点:学习难度较高,适合具有刚需的同学
DearPyGui
链接:https://lawsie.github.io/guizero/
PySimpleGui
链接:https://pysimplegui.readthedocs.io/en/latest/
Guietta
链接:https://guietta.readthedocs.io/en/stable/
PyGame
链接:https://www.pygame.org/news
Flexx
简介:一个纯Python工具包,用来创建图形化界面应用程序。其使用Web技术进行界面渲染
Pywin32
简介:Windows Pywin32允许用户像VC一样的形式来使用Python开发win32应用
Pyui4win
简介:一个开源的采用自绘技术的界面库
每个工具包都有优缺点,所以工具包的选择取决于用户的应用场景
wxPython
安装:pip3 install -U wxPython
创建应用程序:
概念理解:
应用程序对象
管理主事件循环,主事件循环是wxPython程序的动力。
顶级窗口
管理其窗口的组件和其他分配给他的数据对象。 窗口和它的组件的触发事件基于用户的动作,并接受事件通知以便改变现实
通常用于管理最重要的数据,控制并呈现给用户

创建一个wx.App子类
这是wx的应用程序对象,只有在这个对象创建以后,相应的UI对象才可以被正确初始化。一般最后一句是 app.MainLoop(),形成消息循环,否则程序将直接退出。
步骤:
1、定义子类
2、子类中写一个Onlnit()初始化方法
3、在程序的主要部分创建这个类的实例
4、调用应用程序实例的MainLoop()方法,将程序的控制权交给wxPython
import wx 导入wxPython 创建一个子类使用: class App(wx): def Onlnit(self): 初始化方法 frame = wx.Frame(parent=None, title='第一个') 创建窗口 frame.Show() 显示窗口 return True if __name__ == '__main__': app = App() 创建App类的实例 app.MainLoop() 调用App类的MainLoop()主循环方法
直接使用wx.App
通常,如果在系统中只有一个窗口,可以不创建wx.APP的子类,直接使用wx.App。这个类提供了一个最基本的Onlnit()初始化方法
import wx 导入wxPython app = wx.App() 初始化wx.App类 frame = wx.Frame(None,title='Hello wxPython') 定义顶级窗口 frame.Show() 显示窗口 app.MainLoop() 调用App类的MainLoop()主循环方法
使用wx.Frame框架
在GUI中,框架通常也叫窗口。 框架是一个容器,用户可以将它在屏幕上任意移动,并且可以对它进行缩放,它通常包含诸如标题栏、菜单等。 在wxPython中,wx.Frame是所有框架的父类。当用户创建wx.Frame的子类时,子类应调用其父类的构造器wx.Frame.__init__()。
构造器语法: wx.Frame(parent,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYLE,name="frame") parent——框架的父窗口,如果是顶级窗口,这个值是None id————关于新窗口的wxPython ID号,通常设为-1,让wx.Python自动生成一个新的ID title———窗口的标题 pos———wx.Point对象,它指定这个新窗口的左上角在屏幕中的位置 size———wx.Size对象,它指定这个窗口的尺寸 style ——指定窗口的类型的常量,可以使用或运算来组合它们 name ——框架内在的名字
import wx 使用wx.Frame框架,创建一个子类 class MyFrame(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(self,parent,id,title='创建 Frame',pos=(300,300),size=(800,800)) if __name__ == '__main__': app = wx.App() 初始化应用 frame =MyFrame(parent=None,id=-1) 实现MyFrame类,并传递参数,MyFrame类自动执行__init__()初始化方法,接受参数,然后调用父类wx.Frame的初始化方法,设置顶级窗口的相关属性 frame.Show() 显示窗口 app.MainLoop() 调用MainLoop()主循环方法
常用控件:
创建完窗口后,我们可以在窗口内添加一些控件, 即按钮、文本、输入框、单选框等
StaticText文本类
纯文本,使用wx.StaticText文本类来完成
构造函数语法: wx.StaticText(parent,id,label,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,name="StaticText") parent——框架的父窗口,如果是顶级窗口,这个值是None id————标识符,使用-1可以自动创建一个唯一的标识符 label ——显示在静态控件的文本内容 pos———wx.Point对象或一个Python元组,窗口的位置 size———wx.Size对象或一个Python元组,窗口的尺寸 style ——样式标记 name ——对象的名字
class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title='创建StaticText类', pos=(300, 50), size=(800, 800)) 创建画板 panel = wx.Panel(self) 创建标题,设置字体样式 title = wx.StaticText(panel, label='Python之禅 \n\t——Tim Peters', pos=(100, 30)) font = wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL) title.SetFont(font) 创建文本 wx.StaticText(panel, label='美丽胜于丑陋。', pos=(100, 80)) wx.StaticText(panel, label='明了胜于晦涩。', pos=(100, 100)) wx.StaticText(panel, label='简洁胜于复杂。', pos=(100, 120)) wx.StaticText(panel, label='复杂胜于脏乱。', pos=(100, 140)) wx.StaticText(panel, label='扁平胜于嵌套。', pos=(100, 160)) wx.StaticText(panel, label='间隔胜于紧凑。', pos=(100, 180)) wx.StaticText(panel, label='重视可读性。', pos=(100, 200)) wx.StaticText(panel, label='特殊情况不足以打破规则,即使特例很实用,也不可违背这些规则。', pos=(100, 220)) wx.StaticText(panel, label='错误是很正常的,要勇于面对和改正,要是你确定不想改,也可以选择pass。', pos=(100, 240)) wx.StaticText(panel, label='面对多种可能(歧义),不要尝试去猜测,而是应该尽量找一种,最好是唯一一种明显的解决方案。', pos=(100, 260)) wx.StaticText(panel, label='不过,如果你不是Python之父的话,这种解决方案一开始可能并不明显。', pos=(100, 280)) wx.StaticText(panel, label='做也许好过不做,但动手前要细思量。', pos=(100, 300)) wx.StaticText(panel, label='如果你无法向人解释清楚你的方案,那肯定不是一个好方案;反之亦然。', pos=(100, 320)) wx.StaticText(panel, label='命名空间是一个绝妙的理念,我们应该多加利用。', pos=(100, 340)) if __name__ == '__main__': app = wx.App() 初始化应用 frame =MyFrame(parent=None,id=-1) 实现MyFrame类,并传递参数,MyFrame类自动执行__init__()初始化方法,接受参数,然后调用父类wx.Frame的初始化方法,设置顶级窗口的相关属性 frame.Show() 显示窗口 app.MainLoop() 调用MainLoop()主循环方法
注意: 这里使用了panel = wx.Panel(self)来创建画板, 并将panel作为父类,然后再将组建放入窗口。 这样将内容分开层次,当窗口有变化,画板也可以跟着变, 画板上的内容理所当然也会跟着变
TextCtrl文本输入类
既可以输入单行,也可以输入多行的文本,还可以作为密码输入控件使用
构造函数语法: wx.TextCtrl(parent,id,value = ' ', pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,validator=wx.DefaultValidator,name=wx.TextCtrlNameStr) parent——框架的父窗口,如果是顶级窗口,这个值是None id————标识符,使用-1可以自动创建一个唯一的标识符 value ——显示在该控件中的初始文本 pos———wx.Point对象或一个Python元组,窗口的位置 size———wx.Size对象或一个Python元组,窗口的尺寸 style ——单行wx.TextCtrl的样式 name ——对象的名字 validator—用于过滤数据,以确保只能输入要接收的数据 style的样式取值: wx.TE_CENTER: 控件中的文本居中。 wx.TE_LEFT: 控件中的文本左对齐。默认行为。 wx.TE_NOHIDESEL: 文本始终高亮显示,只适用于 Windows。 wx.TE_PASSWORD: 不显示所键入的文本,代替以星号显示。 wx.TE_PROCESS_ENTER: 如果使用了这个样式,那么当用户在控件内按下回车键时,一个文本输入事件被触发。否则,按键事件内在的由该文本控件或该对话框管理。 wx.TE_PROCESS_TAB: 如果指定了这个样式,那么通常的字符事件在 Tab键按下时创建(一般意味一个制表符将被插入文本)。否则, tab由对话框来管理,通常是控件间的切换。 wx.TE_READONLY: 文本控件为只读,用户不能修改其中的文本。 wx.TE_RIGHT: 控件中的文本右对齐。
class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title='创建TextCtrl输入文本类', size=(500, 500)) panel = wx.Panel(self) self.title = wx.StaticText(panel, label='请输入用户名和密码', pos=(140, 30)) self.lable_user = wx.StaticText(panel, label='用户名:', pos=(50, 80)) self.text_user = wx.TextCtrl(panel, pos=(100, 80), size=(240,40), style=wx.TE_LEFT) self.lable_pwd = wx.StaticText(panel, label='密 码:', pos=(50, 140)) self.text_pwd = wx.TextCtrl(panel, pos=(100, 140), size=(240,40), style=wx.TE_PASSWORD) if __name__ == '__main__': app = wx.App() 初始化应用 frame =MyFrame(parent=None,id=-1) 实现MyFrame类,并传递参数,MyFrame类自动执行__init__()初始化方法,接受参数,然后调用父类wx.Frame的初始化方法,设置顶级窗口的相关属性 frame.Show() 显示窗口 app.MainLoop() 调用MainLoop()主循环方法
Button按钮类
按钮是GUI界面中应用最广泛的控件,常用于捕获用户生成的单击事件,其最明显的用途是触发绑定到一个处理函数。
构造函数语法: wx.TextCtrl(parent,id,label,pos,size=wx.DefaultSize,style=0,validator,name="button") parent——框架的父窗口,如果是顶级窗口,这个值是None id————标识符,使用-1可以自动创建一个唯一的标识符 label ——显示在按钮上的文本 pos———wx.Point对象或一个Python元组,窗口的位置 size———wx.Size对象或一个Python元组,窗口的尺寸 style ——单行wx.TextCtrl的样式 name ——对象的名字 validator—用于过滤数据,以确保只能输入要接收的数据
import wx class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title='创建TextCtrl输入文本类', size=(500, 500)) # 创建画板 panel = wx.Panel(self) # 创建文本和密码输入框 self.title = wx.StaticText(panel, label='请输入用户名和密码', pos=(140, 30)) self.lable_user = wx.StaticText(panel, label='用户名:', pos=(50, 80)) self.text_user = wx.TextCtrl(panel, pos=(100, 80), size=(240,40), style=wx.TE_LEFT) self.lable_pwd = wx.StaticText(panel, label='密 码:', pos=(50, 140)) self.text_pwd = wx.TextCtrl(panel, pos=(100, 140), size=(240,40), style=wx.TE_PASSWORD) #创建“确定”和“取消”按钮 self.bt_confirm = wx.Button(panel, label='确定', pos=(100, 190)) self.bt_cancel = wx.Button(panel, label='取消', pos=(190, 190)) if __name__ == '__main__': app = wx.App() frame = MyFrame(parent=None, id=-1) frame.Show() app.MainLoop()
BoxSizer布局
上面已经介绍学习了文本、按钮等控件的使用,并将这些控件通过post参数布置在pannel画板上。
但是以上的设置都是以绝对位置固定的,极不方便也不美观
在wx.Python中有一种更智能的布局方式——sizer(尺寸器)。
sizer,是用于自动布局一组窗口控件的算法。 sizer被附加到一个容器,通常是一个框架或面板。 在父容器创建的子窗口控件必须被分别添加到sizer。
wx.Python提供的sizer
1.wx.BoxSizer:在一条水平线或垂直线上的窗口部件的布局。通常用于嵌套的样式,可用于几乎任何类型的布局。
2.wx.StaticBoxSizer:
3.wx.GridSizer:十分基础的网格布局,当用户要放置的窗口部件都是同样尺寸且整齐地放入一个规则的网格中时可以使用这个尺寸器。
4.wx.FlexGridSizer:这sizer类似wx.GridSizer,但更有灵活性,所有行和列都不一定是相同的高度或宽度
5.wx.GridBagSizer:最灵活了,随意放置
import wx class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, '用户登录', size=(500, 500)) # 创建画板 panel = wx.Panel(self) self.title = wx.StaticText(panel, label='请输入用户名和密码') # 添加容器,容器中控件使用纵向排列的参数 vsizer = wx.BoxSizer(wx.VERTICAL) # vsizer = wx.BoxSizer(wx.HORIZONTAL) # 使用Add()方法,将控件加入sizer vsizer.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER, border=15) # 控件设置完毕,setsizer方法将其配置到panel的内容中 panel.SetSizer(vsizer) if __name__ == '__main__': app = wx.App() frame = MyFrame(parent=None, id=-1) frame.Show() app.MainLoop()
import wx class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, '用户登录', size=(500, 500)) # 创建画板 panel = wx.Panel(self) # 创建“确定”和“取消”按钮,并绑定事件 self.bt_confirm = wx.Button(panel, label='确定') self.bt_cancel = wx.Button(panel, label='取消') # 创建文本,左对齐 self.title = wx.StaticText(panel, label='请输入用户名和密码') self.lable_user = wx.StaticText(panel, label='用户名:') self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT) self.lable_pwd = wx.StaticText(panel, label='密 码:') self.text_pwd = wx.TextCtrl(panel, style=wx.TE_PASSWORD) # 添加容器,容器中控件横向排列 hsizer_user = wx.BoxSizer(wx.HORIZONTAL) hsizer_user.Add(self.lable_user,proportion = 0,flag = wx.ALL,border = 5) hsizer_user.Add(self.text_user,proportion = 1,flag = wx.ALL,border = 5) hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL) hsizer_pwd.Add(self.lable_pwd,proportion = 0,flag = wx.ALL,border = 5) hsizer_pwd.Add(self.text_pwd,proportion = 1,flag = wx.ALL,border = 5) hsizer_button = wx.BoxSizer(wx.HORIZONTAL) hsizer_button.Add(self.bt_confirm,proportion = 0,flag = wx.CENTER,border = 5) hsizer_button.Add(self.bt_cancel,proportion = 0,flag = wx.CENTER,border = 5) # 添加容器,容器中控件纵向排列 vsizer_all = wx.BoxSizer(wx.VERTICAL) vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER, border=15) vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_button, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER, border=15) panel.SetSizer(vsizer_all) if __name__ == '__main__': app = wx.App() frame = MyFrame(parent=None, id=-1) frame.Show() app.MainLoop()
事件处理:
概念:用户执行的动作就叫作事件,event, 比如,单击按钮,就是一个单击事件
绑定事件:
概念:将函数绑定到所涉及事件可能发生的控件上,当事件发生时,函数就会被调用。
方法:控件的Bind()方法
bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit) wx.EVT_BUTTON:事件类型为按钮类型。在wx.Python中还有很多wx.EVT_开头的时间类型,按需使用。 OnclickSubmit:方法名,当事件发生时所需要执行的方法。
import wx class MyFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, '用户登录', size=(400, 300)) # 创建面板 panel = wx.Panel(self) # 创建“确定”和“取消”按钮,并绑定事件 self.bt_confirm = wx.Button(panel, label='确定') self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit) self.bt_cancel = wx.Button(panel, label='取消') self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel) # 创建文本,左对齐 self.title = wx.StaticText(panel, label="请输入用户名和密码") self.label_user = wx.StaticText(panel, label="用户名:") self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT) self.label_pwd = wx.StaticText(panel, label="密 码:") self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD) # 添加容器,容器中控件按横向并排排列 hsizer_user = wx.BoxSizer(wx.HORIZONTAL) hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5) hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5) hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL) hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5) hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5) hsizer_button = wx.BoxSizer(wx.HORIZONTAL) hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5) hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5) # 添加容器,容器中控件按纵向并排排列 vsizer_all = wx.BoxSizer(wx.VERTICAL) vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,border=15) vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15) panel.SetSizer(vsizer_all) def OnclickSubmit(self,event): """ 点击确定按钮,执行方法 """ message = "" username = self.text_user.GetValue() # 获取输入的用户名 password = self.text_password.GetValue() # 获取输入的密码 if username == "" or password == "" : # 判断用户名或密码是否为空 message = '用户名或密码不能为空' elif username =='mr' and password =='mrsoft': # 用户名和密码正确 message = '登录成功' else: message = '用户名和密码不匹配' # 用户名或密码错误 wx.MessageBox(message) # 弹出提示框 def OnclickCancel(self,event): """ 点击取消按钮,执行方法 """ self.text_user.SetValue("") # 清空输入的用户名 self.text_password.SetValue("") # 清空输入的密码 if __name__ == '__main__': app = wx.App() frame = MyFrame(parent=None, id=-1) frame.Show() app.MainLoop()
Pygame游戏编程
概念: pygame是跨平台Python模块, 专为电子游戏设计,包含图像、声音等,创建在SDL(simple directmedia layer)基础上, 允许实时电子游戏研发而不会被低级语言,如C语言或是更低级的汇编语言束缚。 基于这样一个设想, 所有需要的游戏功能和理念(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言(如Python)提供。
安装:pip install pygame
pygame的常用模块:
color
Pygame 中用于描述颜色的对象
pygame.Color.r — 获取或设置 Color 对象的红色值
pygame.Color.g — 获取或设置 Color 对象的绿色值
pygame.Color.b — 获取或设置 Color 对象的蓝色值
pygame.Color.a — 获取或设置 Color 对象的 alpha 值
pygame.Color.cmy — 获取或设置 Color 对象表示的 CMY 值
pygame.Color.hsva — 获取或设置 Color 对象表示的 HSVA 值
pygame.Color.hsla — 获取或设置 Color 对象表示的 HSLA 值
pygame.Color.i1i2i3 — 获取或设置 Color 对象表示的 I1I2I3 值
pygame.Color.normalize() — 返回 Color 对象的标准化 RGBA 值
pygame.Color.correct_gamma() — 应用一定的伽马值调整 Color 对象
pygame.Color.set_length() — 设置 Color 对象的长度(成员数量)
display
Pygame 中用于控制窗口和屏幕显示的模块
pygame.display.init() — 初始化 display 模块
pygame.display.quit() — 结束 display 模块
pygame.display.get_init() — 如果 display 模块已经初始化,返回 True
pygame.display.set_mode() — 初始化一个准备显示的窗口或屏幕
pygame.display.get_surface() — 获取当前显示的 Surface 对象
pygame.display.flip() — 更新整个待显示的 Surface 对象到屏幕上
pygame.display.update() — 更新部分软件界面显示
pygame.display.get_driver() — 获取 Pygame 显示后端的名字
pygame.display.Info() — 创建有关显示界面的信息对象
pygame.display.get_wm_info() — 获取关于当前窗口系统的信息
pygame.display.list_modes() — 获取全屏模式下可使用的分辨率
pygame.display.mode_ok() — 为显示模式选择最合适的颜色深度
pygame.display.gl_get_attribute() — 获取当前显示界面 OpenGL 的属性值
pygame.display.gl_set_attribute() — 设置当前显示模式的 OpenGL 属性值
pygame.display.get_active() — 当前显示界面显示在屏幕上时返回 True
pygame.display.iconify() — 最小化显示的 Surface 对象
pygame.display.toggle_fullscreen() — 切换全屏模式和窗口模式
pygame.display.set_gamma() — 修改硬件显示的 gama 坡道
pygame.display.set_gamma_ramp() — 自定义修改硬件显示的 gama 坡道
pygame.display.set_icon() — 修改显示窗口的图标
pygame.display.set_caption() — Set the current window caption
pygame.display.get_caption() — Get the current window caption
pygame.display.set_palette() — Set the display color palette for indexed displays 这个模块提供控制 Pygame 显示界面(display)的各种函数。
draw
pygame.draw Pygame 中绘制图形的模块
pygame.draw.rect() — 绘制矩形
pygame.draw.polygon() — 绘制多边形
pygame.draw.circle() — 根据圆心和半径绘制圆形
pygame.draw.ellipse() — 根据限定矩形绘制一个椭圆形
pygame.draw.arc() — 绘制弧线
pygame.draw.line() — 绘制线段
pygame.draw.lines() — 绘制多条连续的线段
pygame.draw.aaline() — 绘制抗锯齿的线段
pygame.draw.aalines() — 绘制多条连续的线段(抗锯齿)
event
pygame.event用于处理事件与事件队列的 Pygame 模块
pygame.event.pump() — 让 Pygame 内部自动处理事件
pygame.event.get() — 从队列中获取事件
pygame.event.poll() — 从队列中获取一个事件
pygame.event.wait() — 等待并从队列中获取一个事件
pygame.event.peek() — 检测某类型事件是否在队列中
pygame.event.clear() — 从队列中删除所有的事件
pygame.event.event_name() — 通过 id 获得该事件的字符串名字
pygame.event.set_blocked() — 控制哪些事件禁止进入队列
pygame.event.set_allowed() — 控制哪些事件允许进入队列
pygame.event.get_blocked() — 检测某一类型的事件是否被禁止进入队列
pygame.event.set_grab() — 控制输入设备与其他应用程序的共享
pygame.event.get_grab() — 检测程序是否共享输入设备
pygame.event.post() — 放置一个新的事件到队列中
pygame.event.Event() — 创建一个新的事件对象
pygame.event.EventType — 代表 SDL 事件的 Pygame 对象 Pygame 通过事件队列控制所有的时间消息。该模块中的程序将帮你管理事件队列
font
pygame.fontPygame 中加载和表示字体的模块
pygame.font.init() —— 初始化字体模块
pygame.font.quit() —— 还原字体模块
pygame.font.get_init() —— 检查字体模块是否被初始化
pygame.font.get_default_font() —— 获得默认字体的文件名
pygame.font.get_fonts() —— 获取所有可使用的字体
pygame.font.match_font() —— 在系统中搜索一种特殊的字体
pygame.font.SysFont() —— 从系统字体库创建一个 Font 对象 类
pygame.font.Font —— 从一个字体文件创建一个 Font 对象 字体模块可以在一个新的 Surface 对象上表示 TrueType 字体
image
pygame.image用于图像传输的 Pygame 模块
pygame.image.load() — 从文件加载新图片
pygame.image.save() — 将图像保存到磁盘上
pygame.image.get_extended() — 检测是否支持载入扩展的图像格式
pygame.image.tostring() — 将图像转换为字符串描述
pygame.image.fromstring() — 将字符串描述转换为图像
pygame.image.frombuffer() — 创建一个与字符串描述共享数据的 Surface 对象 image 模块包含了加载和保存图像的函数,同时转换为 Surface 对象支持的格式
key
pygame.key与键盘相关的 Pygame 模块
pygame.key.get_focused() — 当窗口获得键盘的输入焦点时返回 True
pygame.key.get_pressed() — 获取键盘上所有按键的状态
pygame.key.get_mods() — 检测是否有组合键被按下
pygame.key.set_mods() — 临时设置某些组合键为被按下状态
pygame.key.set_repeat() — 控制重复响应持续按下按键的时间
pygame.key.get_repeat() — 获取重复响应按键的参数
pygame.key.name() — 获取按键标识符对应的名字 该模块包含处理与键盘操作相关的函数
locals
pygame.localsPygame 定义的常量
这个模块包含了 Pygame 定义的各种常量。它的内容会被自动放入到 Pygame 模块的名字空间中。你可以使用from pygame.locals import将所有的 Pygame 常量导入
mixer
pygame.mixer用于加载和播放声音的pygame模块
pygame.mixer.init — 初始化混音器模块
pygame.mixer.pre_init — 预设混音器初始化参数
pygame.mixer.quit — 卸载混音器模块
pygame.mixer.get_init — 测试混音器是否初始化
pygame.mixer.stop — 停止播放所有通道
pygame.mixer.pause — 暂停播放所有通道
pygame.mixer.unpause — 恢复播放
pygame.mixer.fadeout — 淡出停止
pygame.mixer.set_num_channels — 设置播放频道的总数
pygame.mixer.get_num_channels — 获取播放频道的总数
pygame.mixer.set_reserved — 预留频道自动使用
pygame.mixer.find_channel — 找到一个未使用的频道
pygame.mixer.get_busy — 测试混音器是否正在使用类
pygame.mixer.Sound — 从文件或缓冲区对象创建新的Sound对象
pygame.mixer.Channel — 创建一个Channel对象来控制播放
mouse
pygame.mousePygame 中与鼠标工作相关的模块
pygame.mouse.get_pressed() —— 获取鼠标按键的情况(是否被按下)
pygame.mouse.get_pos() —— 获取鼠标光标的位置
pygame.mouse.get_rel() —— 获取鼠标一系列的活动
pygame.mouse.set_pos() —— 设置鼠标光标的位置
pygame.mouse.set_visible() —— 隐藏或显示鼠标光标
pygame.mouse.get_focused() —— 检查程序界面是否获得鼠标焦点
pygame.mouse.set_cursor() —— 设置鼠标光标在程序内的显示图像
pygame.mouse.get_cursor() —— 获取鼠标光标在程序内的显示图像
Rect
class pygame.RectRect 是用于存储矩形坐标的 Pygame 对象
pygame.Rect.copy() — 拷贝 Rect 对象
pygame.Rect.move() — 移动 Rect 对象
pygame.Rect.move_ip() — 原地移动 Rect 对象
pygame.Rect.inflate() — 放大和缩小 Rect 对象的尺寸
pygame.Rect.inflate_ip() — 原地放大和缩小 Rect 对象的尺寸
pygame.Rect.clamp() — 将一个 Rect 对象移动到另一个 Rect 对象的中心
pygame.Rect.clamp_ip() — 原地将一个 Rect 对象移动到另一个 Rect 对象的中心
pygame.Rect.clip() — 获取两个 Rect 对象互相重叠的部分
pygame.Rect.union() — 将两个 Rect 对象合并
pygame.Rect.union_ip() — 原地将两个 Rect 对象合并
pygame.Rect.unionall() — 将多个 Rect 对象合并
pygame.Rect.unionall_ip() — 原地将多个 Rect 对象合并
pygame.Rect.fit() — 按照一定的宽高比调整 Rect 对象
pygame.Rect.normalize() — 翻转 Rect 对象(如果尺寸为负数)
pygame.Rect.contains() — 检测一个 Rect 对象是否完全包含在该 Rect 对象内
pygame.Rect.collidepoint() — 检测一个点是否包含在该 Rect 对象内
pygame.Rect.colliderect() — 检测两个 Rect 对象是否重叠
pygame.Rect.collidelist() — 检测该 Rect 对象是否与列表中的任何一个矩形有交集
pygame.Rect.collidelistall() — 检测该 Rect 对象与列表中的每个矩形是否有交集
pygame.Rect.collidedict() — 检测该 Rect 对象是否与字典中的任何一个矩形有交集
pygame.Rect.collidedictall() — 检测该 Rect 对象与字典中的每个矩形是否有交集
Surface
用于表示图像的Pygame对象
Surface((width, height), flags=0, depth=0, masks=None) -> Surface
Surface((width, height), flags=0, Surface) -> Surface
pygame.Surface.blit—将一个图像绘制到另一个
pygame.Surface.blits—将许多图像绘制到另一个
pygame.Surface.convert—更改图像的像素格式
pygame.Surface.convert_alpha—改变包括每像素α的图像的像素格式
pygame.Surface.copy—创建Surface的新副本
pygame.Surface.fill—用纯色填充Surface
pygame.Surface.scroll—将表面图像移动到位
pygame.Surface.set_colorkey—设置透明颜色键
pygame.Surface.get_colorkey—获取当前透明的colorkey
pygame.Surface.set_alpha—设置完整Surface图像的Alpha值
pygame.Surface.get_alpha—获取当前的Surface透明度值
pygame.Surface.lock—锁定Surface内存以进行像素访问
pygame.Surface.unlock—从像素访问中解锁Surface存储器
pygame.Surface.mustlock—测试Surface是否需要锁定
pygame.Surface.get_locked—测试Surface是否被当前锁定
pygame.Surface.get_locks—获取Surface的锁
pygame.Surface.get_at—获取单个像素的颜色值
pygame.Surface.set_at—设置单个像素的颜色值
pygame.Surface.get_at_mapped—获取单个像素的映射颜色值
pygame.Surface.get_palette—获取8位Surface的颜色索引调色板
pygame.Surface.get_palette_at—获取调色板中单个条目的颜色
pygame.Surface.set_palette—设置8位Surface的调色板
pygame.Surface.set_palette_at—在8位Surface调色板中设置单个索引的颜色
pygame.Surface.map_rgb—将颜色转换为映射的颜色值
pygame.Surface.unmap_rgb—将映射的整数颜色值转换为颜色
pygame.Surface.set_clip—设置Surface的当前剪切区域
pygame.Surface.get_clip—获取Surface的当前剪切区域
pygame.Surface.subsurface—创建一个引用其父级的新表面
pygame.Surface.get_parent—找到地下的父母
pygame.Surface.get_abs_parent—找到地下的顶级父级
pygame.Surface.get_offset—在父母中找到子地下的位置
pygame.Surface.get_abs_offset—在其顶级父级中查找子级子表面的绝对位置
pygame.Surface.get_size—获取Surface的尺寸
pygame.Surface.get_width—获取Surface的宽度
pygame.Surface.get_height—获得Surface的高度
pygame.Surface.get_rect—得到Surface的矩形区域
pygame.Surface.get_bitsize—获取Surface像素格式的位深度
pygame.Surface.get_bytesize —获取每个Surface像素使用的字节数
pygame.Surface.get_flags—获取用于Surface的其他标志
pygame.Surface.get_pitch— 获取每个Surface行使用的字节数
pygame.Surface.get_masks—位掩码需要在颜色和映射的整数之间进行转换
pygame.Surface.set_masks—设置在颜色和映射整数之间转换所需的位掩码
pygame.Surface.get_shifts—在颜色和映射的整数之间转换所需的位移
pygame.Surface.set_shifts—设置在颜色和映射整数之间转换所需的位移
pygame.Surface.get_losses—用于在颜色和映射整数之间进行转换的有效位
pygame.Surface.get_bounding_rect—找到包含数据的最小rect
pygame.Surface.get_view—返回Surface像素的缓冲区视图。
pygame.Surface.get_buffer—获取Surface的像素的缓冲对象。
pygame.Surface._pixels_address—像素缓冲地址
time
pygame.timePygame 中用于监控时间的模块
pygame.time.get_ticks() —— 获取以毫秒为单位的时间
pygame.time.wait() —— 暂停程序一段时间
pygame.time.delay() —— 暂停程序一段时间
pygame.time.set_timer() —— 在事件队列上重复创建一个事件
pygame.time.Clock() —— 创建一个对象来帮助跟踪时间
Pygame中的时间以毫秒(1/1000秒)表示。大多数平台的时间分辨率有限,大约为10毫秒。该分辨率(以毫秒为单位) 以常量 TIMER_RESLUTION 给出
music
pygame.mixer.music Pygame 中控制音频流的模块
pygame.mixer.music.load() —— 载入一个音乐文件用于播放
pygame.mixer.music.play() —— 开始播放音乐流
pygame.mixer.music.rewind() —— 重新开始播放音乐
pygame.mixer.music.stop() —— 结束音乐播放
pygame.mixer.music.pause() —— 暂停音乐播放
pygame.mixer.music.unpause() —— 恢复音乐播放
pygame.mixer.music.fadeout() —— 淡出的效果结束音乐播放
pygame.mixer.music.set_volume() —— 设置音量
pygame.mixer.music.get_volume() —— 获取音量
pygame.mixer.music.get_busy() —— 检查是否正在播放音乐
pygame.mixer.music.set_pos() —— 设置播放的位置
pygame.mixer.music.get_pos() —— 获取播放的位置
pygame.mixer.music.queue() —— 将一个音乐文件放入队列中,并排在当前播放的音乐之后
pygame.mixer.music.set_endevent() —— 当播放结束时发出一个事件
pygame.mixer.music.get_endevent() —— 获取播放结束时发送的事件
pygame
pygamePygame 最顶层的包
pygame.init() — 初始化所有导入的 pygame 模块
pygame.quit() — 卸载所有导入的 pygame 模块
pygame.error() — 标准 pygame 异常模块
pygame.get_error() — 获得当前错误信息
pygame.set_error() — 设置当前错误信息
pygame.get_sdl_version() — 获得 SDL 的版本号
pygame.get_sdl_byteorder() — 获得 SDL 的字节顺序
pygame.register_quit() — 注册一个函数,这个函数将在 pygame 退出时被调用
pygame.encode_string() — 对 unicode 或字节对象编码
pygame.encode_file_path() — 将 unicode 或字节对象编码为文件系统路径
pygame 包是可供使用的最顶层的包。Pygame 被分成许多子模块,但是并不会影响程序使用 Pygame
详细解析看以下链接: https://blog.csdn.net/qq_42554007/article/details/107011444?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162498097316780265485976%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162498097316780265485976&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107011444.first_rank_v2_pc_rank_v29&utm_term=pygame%E5%B8%B8%E7%94%A8%E6%A8%A1%E5%9D%97&spm=1018.2226.3001.4187
本单元以实际操作为主:
碰壁的小球:
import pygame # 导入pygame模块 import sys # 导入sys模块 pygame.init() # 初始化pygame size = width,height = 640,480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 color = (0,0,0) # 设置颜色 ball = pygame.image.load("足球【改】.png") # 加载图片 ballrect = ball.get_rect() # 获取矩形区域 speed = [5,6] # 设置移动的X轴、Y轴距离 clock = pygame.time.Clock() # 设置时钟 while True: clock.tick(120) # 设置每秒执行次数 # 检查事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 如果点击关闭窗口,则退出 sys.exit() ballrect= ballrect.move(speed) # 移动小球 if ballrect.left<0 or ballrect.right>width: # 碰到左右边缘的事件 speed[0]= -speed[0] if ballrect.top<0 or ballrect.bottom>height: # 碰到上下边缘的事件 speed[1]= -speed[1] screen.fill(color) # 填充颜色 screen.blit(ball,ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部显示 pygame.quit() # 退出pygame
Flappy Bird小游戏:
import pygame import sys import random class Bird(object): """小鸟的行为""" def __init__(self): """定义初始化方法""" self.birdRect = pygame.Rect(65, 50, 50, 50) # 定义小鸟的占位矩形 # 定义小鸟的三种形态 self.birdStatus = [pygame.image.load("1.png"), pygame.image.load("2.png"), pygame.image.load("dead.png")] self.status = 0 # 默认飞行状态 self.birdX = 200 # 小鸟在X轴上的位置 self.birdY = 350 # 小鸟在Y轴上的位置 self.jump = False # 默认小鸟自动降落 self.jumpSpeed = 15 # 定义一次跳跃的高度 self.gravity = 5 # 定义重力 self.dead = False # 默认小鸟是活着的 def birdUpdate(self): # X轴、Y轴的原点在左上角,所以出现的界面是处于第四象限的 if self.jump: # 小鸟在上升时 self.jumpSpeed -= 1 # 跳跃速度递减,上升越来越慢 self.birdY -= self.jumpSpeed # 小鸟Y轴坐标减小,小鸟处于上升状态 else: self.gravity += 0.2 # 降落速度递增,下降越来越快 self.birdY += self.gravity # 小鸟Y轴坐标增加,小鸟处于下降状态 self.birdRect[1] = self.birdY # 小鸟新的显示位置birdRect为刚刚操作后的Y轴位置 class Pipeline(object): """管道的行为""" def __init__(self): """定义初始化方法""" self.walkX = 400; # 管道出现的X轴位置 self.pineUp = pygame.image.load("top.png") self.pineDown = pygame.image.load("bottom.png") def updatePipeline(self): """水平向左移动""" self.walkX -= 5 # 管道X轴坐标递减,这代表管道向左移动 # 当管道运行到一定X轴位置,代表小鸟飞过了管道,分数加1,且重置管道位置 if self.walkX < -80: global score score += 1 self.walkX = 400 def createMap(): """定义创建地图的方法""" screen.fill((255, 255, 255)) # 填充颜色 screen.blit(background, (0, 0)) # 填入到北京 screen.blit(Pipeline.pineUp, (Pipeline.walkX, -300)) # 上管道位置 screen.blit(Pipeline.pineDown, (Pipeline.walkX, 500)) # 下管道位置 Pipeline.updatePipeline() # 更新管道位置,即管道出现移动状态 if Bird.dead: # 如果小鸟撞到管道 Bird.status = 2 elif Bird.jump: # 如果小鸟还在飞 Bird.status = 1 screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 设置小鸟的坐标 Bird.birdUpdate() # 小鸟在地图上移动 screen.blit(font.render(str(score), -1, (255, 255, 255)), (200, 50)) pygame.display.update() # 刷新地图上的显示 def checkDead(): """碰撞检测,即检查小鸟处于的位置而判断属性值应该是生还是死""" # 上方矩形位置 upRect = pygame.Rect(Pipeline.walkX, -300, Pipeline.pineUp.get_width() - 10, Pipeline.pineUp.get_height()) # 下方矩形位置 downRect = pygame.Rect(Pipeline.walkX, 500, Pipeline.pineDown.get_width() - 10, Pipeline.pineDown.get_height()) # 检测小鸟是否和管道的矩形有重合,以判断是否发生碰撞 if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect): Bird.dead = True # 以小鸟的上下位置,检测是否飞出边界,以此判断生死状态 if not 0 < Bird.birdRect[1] < height: Bird.dead = True return True else: return False def getResult(): # 设置文字的内容、样式 final_text1 = "Game Over!" final_text2 = "Your final score is: " + str(score) # 找一下为什么不能用中文? ft1_font = pygame.font.SysFont("Arial", 70) ft1_surf = font.render(final_text1, 1, (242, 3, 36)) ft2_font = pygame.font.SysFont("Arial", 50) ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 设置文字的位置 screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) pygame.display.update() # 更新整个待显示的surface对象到屏幕上 if __name__ == '__main__': """主程序""" pygame.init() # 初始化pygame pygame.font.init() # 初始化字体 font = pygame.font.SysFont("Arial", 50) # 设置默认字体的样式 size = width, height = 800, 800 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 clock = pygame.time.Clock() # 设置时钟 Pipeline = Pipeline() # 实例化管道 Bird = Bird() # 实例化小鸟 score = 0 # 实例化分数 while True: clock.tick(80) # 每秒执行80次 # 轮询事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 判断是否退出状态 sys.exit() # 执行退出 if ( event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN) and not Bird.dead: # 判断事件属于键盘触发或鼠标触发,而且小鸟必须没死 Bird.jump = True # 这样小鸟就可以继续跳 Bird.gravity = 5 # 跳跃的重力参数 Bird.jumpSpeed = 15 # 跳跃的速度(Y轴距离) background = pygame.image.load("Map.png") # 加载背景图 if checkDead(): # 检测小鸟的状态 getResult() # 死亡就显示分数 else: # 否则继续刷新地图 createMap() # 绘制地图 # createMap() pygame.quit() # 退出