资源简介 (共49张PPT)图形用户界面开发Chap10 Python GUI DevelopmentThere is a road in the mountains of books, and diligence is the path字符用户界面2图形用户界面3常用gui开发库10.14Python的GUI实现5TkinterPyQTPyGTKwxPython开源软件,具有优秀的跨平台能力。官网:https://wxpython.orgTkinter轻量级的GUI开发库,有最为悠久的历史,著名的 IDLE 用 Tkinter 实现 GUI基于Tcl脚本语言和Tk开发库创建,通过内嵌在Python解释器内部的Tcl解释器执行同样内嵌在Python的Tk开发库6Tkinter的优缺点7性能不太好,执行速度慢Python事实上的GUI标准开发库创建的 GUI 简单,学起来和用起来也简单优点缺点wxPython8跨平台的GUI开发库,可以在各种操作系统上提供原生的视觉效果基于用C++实现的wxWidgets GUI开发库$ pipwxPython的优缺点9版本更新较慢跨平台平台适应性好优点缺点PyQt是Qt框架的Python绑定,得益于Qt强大的框架,PyQt已经超越了一个完整GUI开发库的范畴,提供很多非GUI的基础功能在具有C++经验的开发人员中非常流行10PyQT的优缺点11要注意避免内存泄露运行时庞大需要学习一些C++知识与Qt、C++开发经验互通可使用大多数为Qt开发的组件有方便的周边工具支持PyQt优点缺点PyGTK是一套 GTK封装的GUI开发库由于它底层绑定的是GTK+,PyGTK在Linux下能够提供和著名的Gnome桌面环境一致的视觉效果12PyGTK的优缺点13在Windows平台表现不太好底层的GTK+提供了各式的可视元素和功能能开发在GNOME桌面系统运行的功能完整的软件优点缺点gui开发1410.210.2.1 一个最简单的gui程序15创建一个简单的wxPython程序# Filename: prog10-1.pyimport wxapp = wx.App()frame = wx.Frame(None, title = "Hello, World!")frame.Show(True)app.MainLoop()File16创建一个GUI程序最基本的步骤17①导入wxpython模块import wx②创建一个wx.App的实例app,代表当前这个应用程序,有且仅有一个app = wx.App()③创建一个wx.Frame对象frame,代表应用程序窗口,至少有一个frame = wx.Frame(None, title = "Hello, World!")④让窗口显示在屏幕上frame.Show(True)⑤进入一个主事件处理循环,让窗口处于等待状态,接收用户的点击或输入等事件引发对象完成某种功能app.MainLoop()wx.Frame的__init__()方法18定义如下:Frame __init__(self, parent, id, title, pos, size, style, name)self和parent这两个参数必须给出,parent表示父窗口,如果没有父窗口参数设置为None。# Filename: prog10-2.pyimport wxclass MyFrame(wx.Frame):def __init__(self, parent, title):wx.Frame.__init__(self, parent, title = title)self.Show(True)if __name__ == '__main__':app = MyApp()frame = wx.Frame(None, title = "Hello, World!")app.MainLoop()prog10-1也可改为:1910.2.2 布局管理20布局管理绝对定位 - 每个窗口组件被创建时可以显式地指定它的位置和大小缺点:定位不灵活调整大小困难受设备、操作系统甚至字体影响wxPython中解决这个问题的最常用方法 - wx.Panelwx.Panel是一种容器,容器也属于组件,可以容纳各种组件提供组件遍历、布局管理等附加功能21布局管理顶层窗口wx.Frame、wx.Panel和一般组件的包含关系22wx.Framewx.Panelwx.TextCtrlwx.Buttonsizer灵活布局的解决方案 - sizerwx.Panel是通过sizer来进行布局管理的所有的sizer都继承自wx.Sizer类,但wx.Sizer类并不被直接使用,而是使用其各种子类每个sizer有自己的定位策略开发者只需要选择合适策略的sizer将窗口组件放入,并且指定好需求即可23sizersizer本身不是一个容器或一个窗口组件,它只是一个屏幕布局的算法sizer允许嵌套wxPython常用的sizerwx.BoxSizerwx.FlexGridSizerwx.GridSizerwx.GridBagSizerwx.StaticBoxSizer24各种sizer示意BoxSizerBoxSizerGridSizerFlexGridSizer所有组件大小一致,固定一个方向,在另外一个方向生长行高和列宽由最大的组件决定25使用sizer的步骤260103020405创建自动调用尺寸的容器panel创建子窗口(窗体组件)创建sizer使用sizer的Add()方法将每个子窗口添加给sizer调用容器的SetSizerAndFit (sizer)方法一个基本的sizer使用程序例# Filename: sizer_example.pypanel = wx.Panel(self)sizer = wx.BoxSizer(wx.VERTICAL)button = wx.Button(panel, label = "Click Me")sizer.Add(button)panel.SetSizerAndFit(sizer)File2710.2.3 组件28组件组件容器(Containers)——用于容纳其他组件例:wx.Panel等动态组件(Dynamic Widgets)——可以被用户编辑例:wx.Button、wx.TextCtrl、wx.ListBox等静态组件(Static Widgets)——显示信息用,不能被用户编辑例:wx.StaticBitmap、wx.StaticText、wxStaticLine等其他组件例:wx.ToolBar、wx.MenuBar、wx.StatusBar29应用程序示例30静态文本按钮菜单输入框列表框wx.Button及其家族按钮功能:接受用户的点击事件,触发相应的操作。常用按钮:wx.Button:文本按钮wx.BitmapButton:位图按钮wx.ToggleButton:开关按钮绑定处理按钮点击的事件31wx.Button32# Filename: sizer_example.pyimport wxclass ScoreReportFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent)panel = wx.Panel(self)panel_sizer = wx.BoxSizer(wx.VERTICAL)panel_sizer.AddSpacer(10)button = wx.Button(panel, -1, label = "Print")panel_sizer.Add(button, 0, wx.LEFT, border = 10)panel.SetSizer(panel_sizer)panel.Layout()self.SetTitle("Score Report")self.Centre()self.Show(True)if __name__ == '__main__':app = wx.App()ScoreReportFrame(None)app.MainLoop()wx.RadioButton和wx.CheckBox复选框(wx.CheckBox)用于从一组可选项中,同时选中多个选项单选按钮(wx.RadioButton)用于从一组互斥的选项中,选取其一33wx.RadioButton和wx.CheckBox34hbox_options = wx.BoxSizer(wx.HORIZONTAL)radiobutton1 = wx.RadioButton(panel, label = 'Portrait', style = wx.RB_GROUP)hbox_options.Add(radiobutton1, 0, wx.LEFT, border = 10)radiobutton2 = wx.RadioButton(panel, label = 'Landscape')hbox_options.Add(radiobutton2, 0, wx.LEFT, border = 10)hbox_options.AddSpacer(10)checkbox = wx.CheckBox(panel, label = 'Add Filename')hbox_options.Add(checkbox, 0, wx.LEFT | wx.ALIGN_RIGHT, border = 10)wx.StaticText和wx.TextCtrl文本框用于接收用户在框内输入的信息,或显示由程序提供的信息静态文本框(wx.StaticText,标签):显示静态文本内容文本框(wx.TextCtrl)和用户进行文本双向交换常用形式:单行,多行,富文本框35wx.StaticText和wx.TextCtrl36hbox_search = wx.BoxSizer(wx.HORIZONTAL)prompt = wx.StaticText(panel, label = 'Input name to filter')hbox_search.Add(prompt, 0, wx.LEFT, border = 10)hbox_search.AddSpacer(10)name = wx.TextCtrl(panel, value = '')hbox_search.Add(name, 0, wx.LEFT, border = 10)panel_sizer.Add(hbox_search)panel_sizer.AddSpacer(10)wx.ListBox和wx.ListCtrl列表提供一个列表区域,每个项在列表中占据一行,提供单选和多选的功能wx.ListBox只能每行显示一个条目,wx.ListCtrl每行显示多个条目列表能够以下面四种不同模式建造:wx.LC_ICON(图标)wx.LC_SMALL_ICON(小图标)wx.LC_LIST(列表)wx.LC_REPORT (报告)Report 模式List模式37wx.ListCtrl38①选择列表样式listctrl = wx.ListCtrl(panel, -1, style = wx.LC_REPORT)②创建3列数据表头self.list.InsertColumn(0, "No.")self.list.InsertColumn(1, "Name")self.list.InsertColumn(2, "Score")③指定pos行的第0列,第1、2列pos = 0listctrl.InsertItem(pos, "17002001")listctrl.SetItem(pos, 1, "陈纯")listctrl.SetItem(pos, 2, "88")其他组件创建菜单的wx.Menu一堆选项中选择的boBox选择百分比的wx.Slider3910.2.4 事件处理40事件处理机制(Event Handling)GUI程序工作的基本机制之一——事件处理事件移动鼠标,按下鼠标左键、单击按钮等可以由用户操作触发产生,也可以在程序中创建对象产生wxPython程序将特定类型的事件关联到特定的一块代码(方法),当该类型的事件产生时,相关代码将响应事件被自动执行例:当产生鼠标移动事件时,OnMove()方法将被自动调用41按钮常用事件按钮按下事件wx.EV_BUTTON将按钮按下事件wx.EVT_BUTTON通过Bind()方法绑定到OnPrint()方法上# Filename: buttondemo.py…#事件处理器def OnPrint(self, e):wx.MessageBox(…)#绑定事件处理器button = wx.Button(panel, -1, label="Print")sizer.Add(button)… …self.Bind(wx.EVT_BUTTON, self.OnPrint, button)42File菜单常用事件菜单事件wx.EVT_MENU# Filename: menudemo.py#事件处理器def OnClickBigger(self,e):passdef OnClickQuit(self,e):self.Close()#绑定事件处理器self.Bind(wx.EVT_MENU,self.OnClickBigger,biggerItem)self.Bind(wx.EVT_MENU,self.OnClickQuit,id=wx.ID_EXIT)43File点击窗口出现多个Hello, World!# Filename: mouse.pyimport wxclass Frame1(wx.Frame):def __init__(self,superior):… …self.panel.Bind(wx.EVT_LEFT_UP, self.OnClick)def OnClick(self, event):posm = event.GetPosition()wx.StaticText(parent = self.panel,label = "Hello, World!",pos = (posm.x, posm.y))…… #create app and frame, show and execute event loop44File程序示例45# Filename: helloworldbtn.pyimport wxclass Frame1(wx.Frame):def __init__(self,superior):wx.Frame.__init__(self, parent = superior, title = "Hello World in wxPython")panel = wx.Panel(self)sizer = wx.BoxSizer(wx.VERTICAL)self.text1= wx.TextCtrl(panel, value = "Hello, World!", size = (200,180), style = wx.TE_MULTILINE)sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND)button = wx.Button(panel, label = "Click Me")sizer.Add(button)panel.SetSizerAndFit(sizer)panel.Layout()self.Bind(wx.EVT_BUTTON,self.OnClick,button)def OnClick(self, text):self.text1.AppendText("\nHello, World!")示例程序46# Filename: helloworldbtn.pyimport wxclass Frame1(wx.Frame):def __init__(self,superior):wx.Frame.__init__(self, parent = superior, title = "Hello World in wxPython")panel = wx.Panel(self)sizer = wx.BoxSizer(wx.VERTICAL)self.text1= wx.TextCtrl(panel, value = "Hello, World!", size = (200,180), style = wx.TE_MULTILINE)sizer.Add(self.text1, 0, wx.ALIGN_TOP | wx.EXPAND)button = wx.Button(panel, label = "Click Me")sizer.Add(button)panel.SetSizerAndFit(sizer)panel.Layout()self.Bind(wx.EVT_BUTTON,self.OnClick,button)def OnClick(self, text):self.text1.AppendText("\nHello, World!")图形用户界面47小结10.348小结常用GUI开发库在wxPython中创建一个最简单的GUI程序的基本步骤利用wx.Panel布局管理算法进行布局管理常用组件介绍及创建方法利用事件处理函数完成交互49 展开更多...... 收起↑ 资源预览