中职《Python程序设计任务驱动式教程》(人邮版·2021)10基于GUI框架的图形界面设计与网络爬虫应用 教案(表格式)

资源下载
  1. 二一教育资源

中职《Python程序设计任务驱动式教程》(人邮版·2021)10基于GUI框架的图形界面设计与网络爬虫应用 教案(表格式)

资源简介

单元10 基于GUI框架的图形界面设计与网络爬虫应用
课程名称 Python程序设计任务驱动式教程 章名 基于GUI框架的图形界面设计与网络爬虫应用
教学内容 基于GUI框架的图形界面设计与网络爬虫应用 课时 6
项目性质 □演示性 □验证性 □设计性 √综合性
授课班级 授课日期 授课地点
教学目标 了解Python中GUI工具包、窗口坐标系统等基础知识 掌握使用wxPython框架设计图形用户界面的方法 掌握使用PyQt5框架设计图形用户界面的方法 了解Python网络爬虫
教学内容 使用wxPython框架设计图形用户界面 使用PyQt5框架设计图形用户界面 Python网络爬虫
教学重点 使用wxPython框架设计图形用户界面、使用PyQt5框架设计图形用户界面
教学难点 使用wxPython框架设计图形用户界面、使用PyQt5框架设计图形用户界面
教学准备 装有Python的计算机 教学课件PPT 教材:《Python程序设计任务驱动式教程(微课版)》
作业设计
15
教学过程
教学环节 教学内容与过程 (教学内容、教学方法、组织形式、教学手段)
课前组织 做好上课前的各项准备工作(打开计算机、打开课件、打开软件、打开授课计划、教案等),吸引学生注意力。
课程说明 【课前说明】 分别从Python中GUI工具包、窗口坐标系统等知识点进行初步的了解。 【目的】 使学生从了解本节课的学习目标、学习重点、考评方式等方面明确课程学习的要求和目标。
课程内容描述 10.1 使用wxPython框架设计图形用户界面 wxPython是Python的一个优秀的GUI工具包,允许Python程序员很方便地创建完整的、功能键全的用户界面。wxPython也是一款开源软件,并且具有非常优秀的跨平台功能。 要使用wxPython模块(工具包),先要安装该模块,在【命令提示符】窗口使用pip install -U wxPython命令进行安装。 10.1.1 直接使用wx.App类创建可视化窗口 如果在系统中只有一个窗口,可以直接使用wx.App类进行创建,这个类提供了一个最基本的OnInit()初始化方法。 【实例10-1】演示直接使用wx.App类创建可视化窗口的方法 实例10-1的代码如下所示。 import wx # 导入wxPython app = wx.App() # 初始化wx.App类,其中包含OnInit()方法 # 定义一个顶级窗口(None表示顶级窗口) frame = wx.Frame(parent=None, title='显示图书数据') frame.Show() # 显示窗口 app.MainLoop() # 调用wx.App类中的MainLoop()主循环方法 实例10-1的运行结果如图所示。 实例10-1的运行结果 10.1.2 wx.Frame框架 在GUI中框架通常也称为窗口。框架是一个容器,用户可以将它在屏幕上任意移动,并进行缩放,它通常包含标题栏、菜单栏等。在wxPython中,wx.Frame是所有框架的父类。当创建wx.Frame的子类时,子类应该调用其父类的构造器wx.Frame.__int__()。wx.Frame的构造器的基本语法格式如下。 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,让wxPython自动生成一个新的ID。 title:窗口的标题。 pos:wx.Point对象,它指定窗口的左上角在屏幕中间的位置。在GUI程序中,通常(0,0)表示屏幕的左上角位置,默认值(-1,-1)表示让系统决定窗口的位置。 size:wx.Size对象,它指定窗口的初始尺寸,默认值(-1,-1)表示让系统决定窗口的初始尺寸。 style:表示窗口类型的常量。 name:框架的名称,可以使用它来寻找该窗口。 【实例10-2】演示通过wx.Frame的子类创建可视化窗口 实例10-2的代码如下所示。 import wx #导入wxPython class LoginWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="用户登录", \ pos=(100,100), size=(300, 190)) if __name__=='__main__': app = wx.App() # 初始化 loginWin = LoginWindow(parent=None, id=-1) # 实例化LoginWindow并传入参数 loginWin.Show() # 显示窗口 app.MainLoop() # 调用MainLoop()主循环方法 实例10-2的代码中,在主程序中调用LoginWindow类,并传送2个参数,在LoginWindow类中自动执行__init__()初始化方法,接收参数。然后调用父类wx.Frame的__init__()初始化方法,设置顶级窗口的相关属性。 实例10-2的运行结果如图所示。 实例10-2的运行结果 10.1.3 wxPython的常用控件 控件就是创建完窗口以后,在窗口添加的按钮、文本框、文本内容等对象。 1.StaticText文本类 在wxPython中,可以使用wx.StaticText类实现在图形用户界面中设置一些标签性或提示性的文本,这是文本属性静态文本,程序运行过程中不能交互式改变文本内容。使用wx.StaticText类能够改变文本的对齐方式、字体、颜色等。 (1)wx.StaticText类。 wx.StaticText类构造函数的基本语法格式如下。 wx.StaticText(parent , id , label , pos=wx.DefaultPosition , size=wx.DefaultSize , style=0 , name="staticText") 参数说明如下。 parent:父容器。 id:标识符,使用-1可以自动创建一个唯一的标识。 label:显示在控件中的文本内容。 pos:使用wx.Point或Python元组的形式设置控件的位置。 size:使用wx.Point或Python元组的形式设置控件的尺寸。 style:样式标记。 name:对象的名称。 例如: panel = wx.Panel(self) title=wx.StaticText(panel, label="请输入用户名和密码", pos=(100, 10)) (2)wx.Font类。 wx.Font类用于设置文本字体,其构造函数的基本语法格式如下。 wx.Font(pointSize , family , style , weight , underline=False , faceName="" , encoding=wx.FONTENCODING_DEFAULT ) 参数说明如下。 pointSize:用于设置字体大小,单位为磅。 family:用于快速指定一种字体。 style:用于设置字体是否倾斜,其取值有:wx.NORMAL、wx.SLANT、wx.ITALIC。 weight:用于设置字体的醒目程度,其取值有:wx.NORMAL、wx.LIGHT、wx.BOLD。 underline:只在Windows操作系统中有效果,如果其值为True则有下画线,其值为False则无下画线。 faceName:用于指定字体名。 encoding:用于指定中文编码,包括Unicode、UTF-8、GBK、GB2312、ISO-8859-1等编码,大多数情况下使用默认编码即可。 例如: font=wx.Font( 12 , wx.DEFAULT , wx.FONTSTYLE_NORMAL , wx.NORMAL ) title.SetFont(font) 2.TextCtrl输入文本类 wx.StaticText控件只能用于显示静态的文本,要想输入文本与用户进行交互,可以使用wx.TextCtrl类实现。wx.TextCtrl类允许输入单行和多行文本,也可以作为密码输入控件使用,隐藏所输入的文本内容。 wx.TextCtrl类构造函数的基本语法格式如下。 wx.TextCtrl( parent , id , value="" , pos=wx.DefaultPosition , size=wx.DefaultSize , style=0 , validator=wx.DefaultValidator , name=wx.TextCtrlNameStr ) 参数说明如下。 其中参数parent、id、pos、size、style、name的用法与wx.StaticText类的相同。 value:用于设置显示在该控件中的初始文本。 validator:用于过滤数据以确保只能输入要接收的数据。 wx.TextCtrl 构造函数中style参数的取值和说明如表所示。 wx.TextCtrl构造函数中style参数的取值和说明 序号参数取值说明1wx.TE_CENTER文本控件中的文本设置为居中对齐2wx.TE_LEFT文本控件中的文件设置为左对齐,为默认取值3wx.TE_RIGHT文本控件中的文本设置为右对齐4wx.TE_NOHIDESEL文本始终高亮显示,只适用于Windows操作系统5wx.TE_PASSWORD隐藏所输入文本的真实字符,以星号显示所输入的文本6wx.TE_PROCESS_ENTER如果使用该参数,那么当用户在控件内按【Enter】键时,文本输入事件将被触发。否则,按键事件由该文本控件或对话框进行管理7wx.TE_PROCESS_TAP如果指定了这个样式,那么通常字符事件在按【Tab】键时触发。否则,字符事件由对话框来进行管理8wx.TE_READONLY文本控件设置为只读模式,用户不能修改其中的文本
例如: wx.TextCtrl(panel, pos=(100, 35), size=(140,25) , style=wx.TE_LEFT) wx.TextCtrl(panel, pos=(100, 70), size=(140,25) , style=wx.TE_PASSWORD) 3.wx.Button类 按钮是图形用户界面中应用最为广泛的控件之一,它常常用于捕获单击事件,其常见的用途是触发执行绑定的处理函数。 wxPython提供了不同类型的按钮,其中较为简单、较常用的是wx.Button类。wx.Button类构造函数的基本语法格式如下。 wx.Button(parent , id , label , pos , size=wxDefaultSize , style=0 , validator , name="button") wx.Button类构造函数的参数与wx.TextCtrl类构造函数的参数基本相同,在此不赘述,请参考wx.TextCtrl类构造函数的参数说明。其中参数label用于设置显示在按钮上的文本。 【实例10-3】使用wx.StaticText类、wx.TextCtrl类、wx.Button类、wx.Font类共同实现创建一个包含用户名和密码的登录界面 实例10-3的代码如下所示。 import wx # 导入wxPython class LoginWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="用户登录", size=(300, 190)) # 创建面板 panel = wx.Panel(self) # 创建文本,左对齐 title=wx.StaticText(panel, label="请输入用户名和密码", pos=(100, 10)) font=wx.Font(12,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL) title.SetFont(font) wx.StaticText(panel, label="用户名:", pos=(40, 38)) wx.StaticText(panel, label="密 码:", pos=(40, 73)) wx.TextCtrl(panel, pos=(100, 35), size=(140,25) , style=wx.TE_LEFT) wx.TextCtrl(panel, pos=(100, 70), size=(140,25) , style=wx.TE_PASSWORD) # 创建“确定”和“取消”按钮,并绑定事件 wx.Button(panel, label="确定", pos=(50, 110)) wx.Button(panel, label="取消", pos=(150, 110)) if __name__ == "__main__": app = wx.App() # 初始化 loginWin = LoginWindow(parent=None,id=-1) loginWin.Show() # 显示窗口 dataWin=wx.Frame(parent=None,title="显示图书数据") app.MainLoop() # 调用主循环方法 实例10-3的运行结果如图所示。 实例10-3的运行结果 10.1.4 BoxSizer布局 实例10-3中使用了文本控件、按钮等控件,并将这些控件通过设置pos参数布置在panel面板中。这种方式是通过设置控件在面板中的绝对位置来实现控件定位的,过程比较复杂,当窗口大小发生变化时,界面就会变得不够美观。在wxPython中有一种更智能的布局方式:使用尺寸器(sizer)。sizer是用于自动布局一组窗口控件的算法。sizer被附加到一个容器中,容器通常是一个框架或面板,在父容器中创建的控件必须被分别添加到sizer中。当sizer被附加到容器中时,它随后就可以管理它所包含的子布局。 1.wxPython提供的sizer wxPython提供了5个sizer,如表所示。 wxPython提供的5个sizer sizer名称说明BoxSizer在水平或竖直方向布局窗口控件,当窗口尺寸改变时,能很灵活地调整窗口控件的位置。通常应用于嵌套的样式,应用面广GridSizer一种基础的网格布局,当要放置的窗口控件都是同样的尺寸并且需整齐地放入一个规则的网格中时就可以使用它FlexGridSizer对GridSizer稍微做了一些改变,当窗口控件有不同的尺寸时,可以得到更好的效果GridBagSizerGridSizer系列中最灵活的成员之一,使得网络中的窗口控件可以随意放置StaticBoxSizer一个标准的BoxSizer
BoxSizer是wxPython所提供的sizer中最简单、最灵活的布局方式之一。wx.BoxSizer在一条线上布局窗口控件,布局方向可以是水平的或竖直的,控件的数量也可以不固定,并且可以在水平或竖直方向上包含嵌套的子sizer以创建复杂的布局。 sizer能够管理组件的尺寸,只要将控件添加到sizer上,再添加一些布局参数,就可以让sizer去管理父容器的尺寸。 2.wx.BoxSizer的Add()方法 wx.BoxSizer的Add()方法可以将控件加入sizer,使用Add()方法的基本语法格式如下。 Box.Add( control , proportion , flag , border) 参数说明如下。 control:添加的控件名称。 proportion:所要添加的控件在设置的定位方式所代表的方向上占据的空间比例。如果有3个按钮,它们的值分别为0、1、2,都被添加到一个宽度为30的水平排列的wx.BoxSizer中,起始宽度都是10。当sizer的宽度由30改为60时,按钮1的宽度不变,为[10+(60-30)*0/(0+1+2)]=10,按钮2的宽度变为[10+(60-30)*1/(0+1+2)]=20,按钮3的宽度变为[10+(60-30)*2/(0+1+2)]=30。 flag:flag参数与border参数结合使用可以控制边距宽度,其取值选项如表所示。 Add()方法flag参数的取值选项 序号取值选项说明1wx.LEFT左边距2wx.RIGHT右边距3wx.BOTTOM底边距4wx.TOP上边距5wx.ALL上、下、左、右4个边距
flag参数还可以与proportion参数结合,设置控件本身的对齐方式,wx.BoxSizer类中控件本身的对齐方式取值选项如表所示。 表10-5 wx.BoxSizer类中控件本身的对齐方式取值选项 序号取值选项说明1wx.ALIGN_LEFT左边对齐2wx.ALIGN_RIGHT右边对齐3wx.ALIGN_TOP顶部对齐4wx.ALIGN_BOTTOM底部对齐5wx.ALIGN_CENTER_VERTICAL垂直对齐6wx.ALIGN_CENTER_HORIZONTAL水平对齐7wx.ALIGN_CENTER居中对齐8wx.ALIGN_EXPAND所添加的控件将占有sizer定位上的所有可用的空间
border:控制所有添加的控件的边距,就是在控件之间添加一些空白。 通过操作符“|”可以联合使用表10-4所示的flag参数的取值选项,例如:wx.ALIGN_CENTER | wx.BOTTOM | wx.TOP、wx.EXPAND | wx.LEFT | wx.RIGHT。 例如: hsizerUser = wx.BoxSizer(wx.HORIZONTAL) hsizerUser.Add(self.lblUser, proportion=0, flag=wx.ALL, border=5) hsizerUser.Add(self.txtUser, proportion=1, flag=wx.ALL, border=5) 【实例10-4】演示使用wx.BoxSizer设置用户登录界面的布局 实例10-4的代码如电子活页10-1所示。 实例10-4的代码,首先创建文本控件和按钮,然后将其添加到容器中,并且设置横向排列,接着设置纵向排列。在布局过程中,通过设置每个控件的flag和border参数,实现控件位置间的布局。至此,使用wx.BoxSizer将控件的绝对位置布局改为相对位置布局。实例10-4的运行结果如图所示。 实例10-4的运行结果 10.1.5 事件处理 事件(event)就是用户执行的动作,例如在按钮上单击就会触发一个单击事件。前面介绍的实例程序运行时,先在容器中添加控件并完成布局,然后输入用户名和密码,当单击【确定】按钮时,检验输入的用户名和密码是否正确,并输出对应的提示信息。当单击【取消】按钮时,清空已经输入的用户名和密码。要实现这样的功能,就需要使用wxPython的事件处理机制。 在Python程序运行过程中,当发生一个事件时,需要让程序关注到这些事件并且做出反应。这时,可以将函数绑定到所涉及事件可能发生的控件上。当事件发生时,该函数就被调用。利用控件的Bind()方法可以将事件处理函数绑定到事件上。 例如,为【确定】按钮添加一个单击事件,代码如下。 self.btnConfirm.Bind(wx.EVT_BUTTON, self.OnclickSubmit) self.btnCancel.Bind(wx.EVT_BUTTON, self.OnclickCancel) 参数说明如下。 wx.EVT_BUTTON:表示事件类型为鼠标单击事件。在wxPython中有很多以wx.EVT_开头的事件类型,例如,wx.EVT_BUTTON表示鼠标单击事件、wx.EVT_MOTION表示鼠标移动事件,wx.EVT_MOUSEWHEEL表示鼠标滚轮滚动事件。也有一些其他名称的事件类型,例如,wx.ENTER_WINDOW为鼠标进入控件事件,wx.LEAVE_WINDOW为鼠标离开控件事件。 OnclickSubmit:方法名,事件发生时执行该方法。 OnclickCancel:方法名,事件终止时执行该方案。 【任务10-1】使用wxPython框架结合SQLite3数据库设计图形用户登录界面 【任务描述】 (1)在PyCharm集成开发环境中创建项目Unit10。 (2)在项目Unit10中创建Python程序文件10-1Init.py和10-1.py。 (3)使用wxPython框架结合SQLite3数据库设计图形用户登录界面,实现用户登录功能。即分别为【确定】和【取消】按钮添加单击事件,当用户输入用户名和密码后,单击【确定】按钮,首先判断用户名或密码是否为空,如果为空则弹出提示信息对话框,显示“用户名或密码不能为空”的信息;如果输入的用户名和密码正确,则弹出提示信息对话框显示“登录成功”。在提示信息对话框中单击【确认】按钮后,打开【显示图书数据】窗口;否则出现“用户名和密码不匹配”的信息。当单击【取消】按钮时,清空用户输入的用户名和密码,关闭【用户登录】窗口。 【任务实施】 1.创建PyCharm项目Unit10 成功启动PyCharm后,在指定位置“D:\PycharmProject\”创建PyCharm项目Unit10。 2.创建Python程序文件10-1Init.py 在PyCharm项目Unit10中新建Python程序文件10-1Init.py,在新建文件10-1Init.py的代码编辑窗口输入程序代码,程序文件10-1Init.py的代码如电子活页10-2所示。 程序文件10-1Init.py的主要功能是创建SQLite3数据库User.db,在该数据库中新建数据表“用户表”,然后在数据表中添加5条用户记录。 3.创建Python程序文件10-1.py 在PyCharm项目Unit10中新建Python程序文件10-1.py,在新建文件10-1.py的代码编辑窗口输入程序代码,实现创建基于父类wx.Frame的窗口类LoginWindow,定义LoginWindow类的__init__()方法,在窗口中添加面板和多个控件,使用wx.BoxSizer对控件进行合理布局,并绑定事件。 LoginWindow类的__init__()方法的代码如下所示。 class LoginWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, title="用户登录", size=(300, 190)) # 创建面板 panel = wx.Panel(self) # 创建“确定”和“取消”按钮,并绑定事件 self.btnConfirm = wx.Button(panel, label="确定", pos=(50, 110)) self.btnConfirm.Bind(wx.EVT_BUTTON, self.OnclickSubmit) self.btnCancel = wx.Button(panel, label="取消", pos=(150, 110)) self.btnCancel.Bind(wx.EVT_BUTTON, self.OnclickCancel) # 创建文本,左对齐 self.title = wx.StaticText(panel, label="请输入用户名和密码") self.lblUser = wx.StaticText(panel, label="用户名:") self.txtUser = wx.TextCtrl(panel, style=wx.TE_LEFT) self.lblPassword= wx.StaticText(panel, label="密 码:") self.txtPassword = wx.TextCtrl(panel, style=wx.TE_PASSWORD) # 添加容器,容器中控件横向排列 hsizerUser = wx.BoxSizer(wx.HORIZONTAL) hsizerUser.Add(self.lblUser, proportion=0, flag=wx.ALL, border=5) hsizerUser.Add(self.txtUser, proportion=1, flag=wx.ALL, border=5) hsizerPassword = wx.BoxSizer(wx.HORIZONTAL) hsizerPassword.Add(self.lblPassword, proportion=0, flag=wx.ALL, border=5) hsizerPassword.Add(self.txtPassword, proportion=1, flag=wx.ALL, border=5) # 添加容器,容器中控件纵向排列 vsizer = wx.BoxSizer(wx.VERTICAL) vsizer.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_ CENTER, border=5) vsizer.Add(hsizerUser, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15) vsizer.Add(hsizerPassword, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15) panel.SetSizer(vsizer) 在LoginWindow类的__init__()方法中,分别使用Bind()函数为btnConfirm、btnCancel绑定单击事件,单击【确定】按钮时,执行OnclickSubmit()方法判断用户名和密码是否正确,然后使用wx.MessageBox()方法弹出提示信息对话框。单击【取消】按钮时,执行OnclickCancel()方法清空输入的用户名和密码,关闭【用户登录】窗口。LoginWindow类的OnclickSubmit()方法和OnclickCancel()方法的代码如下所示。 def OnclickSubmit(self,event): """ 单击确定按钮,执行方法 """ message = "" username = self.txtUser.GetValue() # 获取输入的用户名 password = self.txtPassword.GetValue() # 获取输入的密码 num =getUserInfo(username, password) if username == "" or password == "": # 判断用户名或密码是否为空 message = "用户名或密码不能为空" wx.MessageBox(message) # 弹出提示信息对话框 elif num >= 0: # 用户名和密码正确 message = "登录成功" wx.MessageBox(message) # 弹出提示信息对话框 loginWin.Hide() dataWin.Show() else: message = "用户名和密码不匹配" # 用户名或密码错误 self.txtUser.SetValue("") # 清空输入的用户名 self.txtPassword.SetValue("") # 清空输入的密码 wx.MessageBox(message) # 弹出提示信息对话框 def OnclickCancel(self,event): """ 单击取消按钮,执行方法 """ self.txtUser.SetValue("") # 清空输入的用户名 self.txtPassword.SetValue("") # 清空输入的密码 loginWin.Hide() 自定义函数initDb()用于连接SQLite3数据库,且返回连接对象和游标对象。自定义函数getUserInfo()用于从数据表“用户表”中获取符合指定条件的数据,判断用户名和密码在数据表“用户表”中是否存在,代码如下所示。 def initDb(): # 数据库文件是User.db,如果文件不存在,会自动在当前目录创建 conn = SQLite3.connect("User.db") # 创建一个游标对象Cursor cursor = conn.cursor() return conn,cursor def getUserInfo(name,password): conn, cursor = initDb() # SQL查询数据语句 strSelect="select 用户名称,密码 from 用户表 where 用户名称= and 密码= " cursor.execute(strSelect,(name,password)) rows=cursor.fetchall() n=len(rows) # 关闭游标 cursor.close() # 关闭Connection conn.close() return n 程序10-1.py的主体程序代码如下。 if __name__ == "__main__": app = wx.App() loginWin = LoginWindow(parent=None,id=-1) loginWin.Show() # 显示窗口 dataWin=wx.Frame(parent=None,title="显示图书数据") app.MainLoop() # 调用主循环方法 单击工具栏中的【保存】按钮,保存程序文件10-1Init.py和10-1.py。 4.运行Python程序 在PyCharm主窗口选择【Run】菜单,在弹出的下拉菜单中选择【Run】。在弹出的【Run】对话框中选择“10-1Init”选项,程序文件10-1Init.py开始运行,完成SQLite3数据库User.db的创建,在该数据库中完成数据表“用户表”的创建,然后在数据表中添加5条用户记录。 运行程序10-1.py,程序10-1.py的运行结果如图所示,显示【用户登录】窗口。 程序10-1.py的运行结果 分别输入正确的用户名和密码,例如输入用户名“admin”,输入密码“666”,如图所示。 在【用户登录】窗口中输入用户名和密码 然后单击【确定】按钮,弹出提示信息对话框显示“登录成功”,如图所示。 “登录成功”的提示信息对话框 在提示信息对话框中单击【确认】按钮,打开【显示图书数据】窗口,如图所示。 【显示图书数据】窗口 10.2 使用PyQt5框架设计图形用户界面 PyQt是Qt库的Python版本,它提供了在Python中开发应用程序的可能,而且开发出的应用程序在其他平台上拥有类似的外观。 PyQt拥有commercial和GPL的双重许可。支持PyQt的公司也会提供license FAQ。 使用pip安装PyQt5的命令如下。 pip install pyqt5 pip install pyqt5-tools 安装完成后会显示提示文字Successfully installed。同时python、Lib、site-packages文件夹中会增加多个子文件夹,可给python、Lib、site-packages、pyqt5_tools、designer.exe创建快捷方式,以后会经常用到。 1.PyQt5中创建图形用户界面的常用模块 PyQt5中创建图形用户界面的常用模块有QtWidgets模块、QtGui模块。 (1)QtWidgets模块。该模块包含了一整套UI元素控件,用于方便地建立符合Windows风格的典型图形用户界面,可以在安装时选择是否使用此功能。 (2)QtGui模块。该模块涵盖了多种基本图形功能的类,包括但不限于窗口集、事件处理、2D图形、基本的图像和界面、字体和文本类。 2.PyQt5主要的类 PyQt5API拥有620多个类和6000个函数,它是一个跨平台的工具包,可以运行在所有主流的操作系统上,包括Windows、Linux和macOS。 PyQt5主要的类如表所示。 PyQt5主要的类 序号类名称说明1QObject类在PyQt5类层次结构中是“顶部类”,它是所有PyQt对象的基类2QPaintDevice类所有可绘制的对象的基类3QApplication类用于管理图形用户界面应用程序的控制流和主要设置。它包含主事件循环,对来自窗口系统和其他资源的所有事件进行处理和调度;它也对应用程序的初始化和结束进行处理,并且提供对话管理;它还对绝大多数系统范围和应用程序范围的设置进行处理4QWidget类所有用户界面类的基类。QDialog类和QFrame类继承自QWidget类,这两个类也有自己的子类5QFrame类有框架的窗口控件的基类,它也被用于直接创建没有任何内容的简单框架,但是通常要用到QHBox或QVBox,因为它们可以自动布置框架中的窗口控件
6QDialog类最普通的顶级窗口之一。如果一个窗口控件没有被嵌入父窗口控件,那么该窗口控件就被称为顶级窗口控件。在通常情况下,顶级窗口控件是有框架和标题栏的窗口。在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口之一7QMainWindow类提供一个有菜单栏、锚接窗口(如工具栏)和状态栏的主应用程序窗口
PyQt5中,如果一个窗口包含一个或者多个窗口,那么这个窗口就是父窗口,被包含的窗口就是子窗口。没有父窗口的窗口就是顶级窗口,QMainWindow类就是顶级窗口,它可以包含很多界面元素。 QMainWindow类可以包含菜单栏、工具栏、状态栏、标题栏等,是GUI程序的主窗口。如果需要创建主窗口,就使用该类。 QDialog类是对话框的基类。对话框一般用来执行短期任务,或者与用户进行互动,它可以是模态的也可以是非模态的。QDialog类没有菜单栏、工具栏、状态栏等。如果需要的是对话框,就选择该类。 QWidget类作为QMainWindow和QWidget的父类,并未细化到主窗口或者对话框,作为通用窗口类。如果不确定具体使用哪种窗口类,就可以使用该类。 【实例10-5】演示使用PyQt5创建一个简单可视化窗口的方法 实例10-5的代码如下所示。 import sys from PyQt5 import QtWidgets from PyQt5.QtGui import QIcon # 所有的PyQt程序必须创建的一个对象(QApplication) app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QWidget() # 没有父类的QWidget将被作为窗口使用 widget.resize(450, 300) #设置窗口大小 widget.move(400, 400) #设置窗口启动时的初始位置 widget.setWindowTitle("浏览数据") #设置窗口的标题名称 widget.setWindowIcon(QIcon('favicon.ico')) #设置窗口图标 widget.show() # 一个widget对象在内存中被创建,接着被显示 sys.exit(app.exec_()) 实例10-5中各条语句的含义见代码中的注释文字。 执行实例10-5中的代码“sys.exit(app.exec_())”,应用程序进入主循环,事件处理开始执行。主循环用于接收来自窗口触发的事件,并且转发它们到widget应用上处理。如果关闭窗口手动退出循环,则会调用exit()方法退出程序;如果调用exit()方法或主widget组件被销毁,则主循环将退出。 实例10-5的运行结果如图所示。 实例10-5的运行结果 【实例10-6】演示调用自定义类创建与显示窗口的方法 实例10-6的代码如下所示。 import sys from PyQt5 import QtWidgets from PyQt5.QtGui import QIcon class UiMainWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(UiMainWindow, self).__init__(parent) self.setupUi() def setupUi(self): self.resize(450, 300) # 设置窗口大小 self.setWindowTitle("浏览数据") # 设置窗口的标题名称 self.setWindowIcon(QIcon('favicon.ico')) # 设置窗口图标 if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) # 主窗体对象 ui = UiMainWindow() # 显示主窗体 ui.show() sys.exit(app.exec_()) 实例10-6的运行结果如上图所示。 3.PyQt5常用的控件 PyQt5常用的控件如表所示。 PyQt5常用的控件 序号控件名称说明1QLabel控件用于显示文本或图像2QLineEdit控件提供一个单页面的单行文本编辑器3QTextEdit控件提供一个单页面的多行文本编辑器4QPushButton控件提供一个命令按钮5QRadioButton控件提供一个单选按钮和一个文本或像素映射标签6QCheckBox控件提供一个带文本标签的复选框7QSpinBox控件允许用户选择一个值,要么通过按向上/向下方向键增加/减少当前显示值,要么直接将值输入文本框中8QScrollBar控件提供一个水平的或垂直的滚动条9QSlider控件提供一个垂直的或水平的滑动条10QComboBox控件一个组合按钮,用于弹出列表11QMenuBar控件提供一个横向的菜单栏12QStatusBar控件提供一个适合呈现状态信息的水平条,通常放在QMainWindow的底部13QToolBar控件提供一个工具栏,可以包含多个按钮,通常放在QMainWindow的顶部14QListView控件可以显示和控制可选的多选列表,可以设置ListMode或IconMode15QPixmap控件可以在控件上显示图像,通常放在QLabel或QPushButton中16QDialog控件对话框窗口的基类
QMainWindow类的主要方法如表所示。 QMainWindow类的主要方法 序号方法说明1addToolBar()添加工具栏2centralWidget()返回窗口中心的控件,未设置则返回NULL3menuBar()返回主窗口的菜单栏4setCentralWidget()设置窗口中心的控件5setStatusBar()设置状态栏6statusBar()获取状态栏对象
【任务10-2】在窗口的QListView控件中显示销量前10名的图书名称列表 【任务描述】 (1)在项目Unit10中创建Python程序文件mySQL10.py,该文件定义MySQLClass类,该类中定义方法connectionSQL(),用于连接数据库;定义方法closeSQL(),用于关闭数据库;定义方法query_top10_bookName(),用于获取数据表“salesRank”中销量榜前10名的书名。 (2)创建一个窗口,在该窗口添加一个QListView控件,将数据表“salesRank”中销量榜前10名的书名添加到QListView控件中,并输出这些图书的名称。 【任务实施】 1.创建Python程序文件mySQL10.py 在PyCharm项目Unit10中新建Python程序文件mySQL10.py,在新建文件mySQL10.py的代码编辑窗口输入程序代码,程序文件mySQL10.py的代码如电子活页10-3所示。 2.创建Python程序文件10-2.py 在PyCharm项目Unit10中新建Python程序文件10-2.py,在新建文件10-2.py的代码编辑窗口输入程序代码,程序文件10-2.py的代码如电子活页10-4所示。 单击工具栏中的【保存】按钮,保存程序文件mySQL10.py和10-2.py。 3.运行Python程序 在PyCharm主窗口选择【Run】菜单,在弹出的下拉菜单中选择【Run】。在弹出的【Run】对话框中选择“10-2”选项,程序文件10-2.py开始运行。程序文件10-2.py的运行结果如图所示。 程序文件10-2.py的运行结果 【任务10-3】窗口中以表格方式展示计算机与互联网图书销量排行榜 【任务描述】 (1)在项目Unit10中创建Python程序文件10-3.py。 (2)在【任务10-2】所定义的MySQLClass类中新增一个方法query_ top100_rankings(),该方法用于获取排行榜中排名前100位图书的排名、图书名称、定价、京东价、出版社等信息。 (3)创建一个窗口,在该窗口添加一个QTableWidget控件,将数据表“salesRank”中排名前100位的图书信息添加到QTableWidget控件中,并以表格方式输出这些图书的排名、图书名称、定价、京东价、出版社等信息。 【任务实施】 在PyCharm项目Unit10中打开程序文件mySQL10.py,在MySQLClass类中新增一个方法query_top100_rankings(),该方法的代码如下所示。 class MySQLClass(object): # 获取排名前100位的图书信息 def query_top100_rankings(self, cur, table): querySQL = "select ID,bookName,dingPrice,jdPrice,publisher from {table}".format(table=table) cur.execute(querySQL) # 执行SQL语句 results = cur.fetchall() # 获取查询的所有记录 row = len(results) # 获取信息条数,作为表格的行 column = len(results[0]) # 获取字段数量,作为表格的列 return row, column, results # 返回信息行与信息列(字段对应的信息) 在PyCharm项目Unit10中创建Python程序文件10-3.py。在程序文件10-3.py中编写程序代码,实现所需功能,程序文件10-3.py的代码如电子活页10-5所示。 程序文件10-3.py的运行结果如图所示。 程序文件10-3.py的运行结果 10.3 Python网络爬虫 网络爬虫(也称为网络蜘蛛)可以按照指定的规则(网络爬虫算法)自动浏览或抓取网络中的数据,使用Python可以轻松编写爬虫程序。 10.3.1 Python爬虫获取数据的基本流程 Python爬虫获取数据的基本流程如图所示。 Python爬虫获取数据的基本流程 (1)发送请求。使用http模块向目标站点发起请求,请求包含请求头、请求体等。但Request模块不能执行JS和CSS代码。 (2)获取响应内容。如果请求的内容存在于目标服务器上,那么服务器会返回响应内容。响应内容包含HTML数据、JSON字符串、图片、视频等。 (3)解析内容。对于用户而言,就是寻找自己需要的信息。对于Python爬虫而言,就是利用正则表达式或者其他库提取目标信息。利用正则表达式(re模块)、第三方解析库(例如Beautiful Soup、pyquery)等解析HTML数据;利用json模块解析JSON数据。 (4)保存数据。解析获取的数据,并将这些数据保存在本地数据库中。 10.3.2 robots协议 robots协议可被看作“网站与爬虫之间的协议”。robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉爬虫此网站中的哪些内容是不应被爬虫获取的,哪些是可以被爬虫获取的。因为一些系统中的URL对大小写敏感,所以robots.txt的文件名应统一为小写。 10.3.3 网络爬虫引发的问题 网络爬虫抓取网络中的数据会引发以下问题。 (1)对网站产生“性能骚扰”。由于网络爬虫频繁访问会给网站服务器带来巨大的额外资源开销,因此会对网站产生“性能骚扰”。 (2)网络爬虫抓取数据存在法律风险。服务器上的数据都有产权归属,如果网络爬虫获取数据进行牟利将会带来法律风险。 (3)网络爬虫可能会造成隐私泄露。网络爬虫可能具备突破简单控制访问的能力,可以获取被保护的数据从而泄露个人隐私。 【任务10-4】网络图片抓取和存储 【任务描述】 (1)在项目Unit10中创建Python程序文件10-4.py。 (2)编写程序,从网上抓取图片(图片所在网址为http://img12./n1/jfs/t29257/219/ 1177122347/147407/b1b81472/5cd8e1eeN71eb128a.jpg),并将抓取的图片以网上原图的名称保存在D盘文件夹pics中。 【任务实施】 在PyCharm项目Unit10中创建Python程序文件10-4.py。在程序文件10-4.py中编写程序代码,实现所需功能,程序文件10-4.py的代码如下所示。 import requests import os url = "http://img12./n1/jfs/t29257/219/1177122347/ 147407/b1b81472/5cd8e1eeN71eb128a.jpg" dir = "D://pics//" path = dir + url.split('/')[-1] #设置图片保存路径并以原图的名称命名 try: if not os.path.exists(dir): os.mkdir(dir) if not os.path.exists(path): re = requests.get(url) with open(path,'wb') as file: file.write(re.content) file.close() print("文件保存成功") else: print("文件已存在") except IOError as err: print(str(err)) 程序文件10-4.py的代码成功运行后,将把从网上抓取的图片以网上原图的名称保存在D盘文件夹pics中。
总结评价 本单元主要学习使用wxPython框架设计图形用户界面、使用PyQt5框架设计图形用户界面、Python网络爬虫。

展开更多......

收起↑

资源预览