Python程序设计教程课件-第十章图形用户界面开发 课件(共49张PPT)

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

Python程序设计教程课件-第十章图形用户界面开发 课件(共49张PPT)

资源简介

(共49张PPT)
图形用户界面开发
Chap10 Python GUI Development
There is a road in the mountains of books, and diligence is the path
字符用户界面
2
图形用户界面
3
常用gui开发库
10.1
4
Python的GUI实现
5
Tkinter
PyQT
PyGTK
wxPython
开源软件,具有优秀的跨平台能力。官网:
https://wxpython.org
Tkinter
轻量级的GUI开发库,有最为悠久的历史,著名的 IDLE 用 Tkinter 实现 GUI
基于Tcl脚本语言和Tk开发库创建,通过内嵌在Python解释器内部的Tcl解释器执行同样内嵌在Python的Tk开发库
6
Tkinter的优缺点
7
性能不太好,执行速度慢
Python事实上的GUI标准开发库
创建的 GUI 简单,学起来和用起来也简单
优点
缺点
wxPython
8
跨平台的GUI开发库,可以在各种操作系统上提供原生的视觉效果
基于用C++实现的wxWidgets GUI开发库
$ pip
wxPython的优缺点
9
版本更新较慢
跨平台
平台适应性好
优点
缺点
PyQt
是Qt框架的Python绑定,得益于Qt强大的框架,PyQt已经超越了一个完整GUI开发库的范畴,提供很多非GUI的基础功能
在具有C++经验的开发人员中非常流行
10
PyQT的优缺点
11
要注意避免内存泄露
运行时庞大
需要学习一些C++知识
与Qt、C++开发经验互通
可使用大多数为Qt开发的组件
有方便的周边工具支持PyQt
优点
缺点
PyGTK
是一套 GTK封装的GUI开发库
由于它底层绑定的是GTK+,PyGTK在Linux下能够提供和著名的Gnome桌面环境一致的视觉效果
12
PyGTK的优缺点
13
在Windows平台表现不太好
底层的GTK+提供了各式的可视元素和功能
能开发在GNOME桌面系统运行的功能完整的软件
优点
缺点
gui开发
14
10.2
10.2.1 一个最简单的gui程序
15
创建一个简单的wxPython程序
# Filename: prog10-1.py
import wx
app = wx.App()
frame = wx.Frame(None, title = "Hello, World!")
frame.Show(True)
app.MainLoop()
File
16
创建一个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.py
import wx
class 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也可改为:
19
10.2.2 布局管理
20
布局管理
绝对定位 - 每个窗口组件被创建时可以显式地指定它的位置和大小
缺点:定位不灵活
调整大小困难
受设备、操作系统甚至字体影响
wxPython中解决这个问题的最常用方法 - wx.Panel
wx.Panel是一种容器,容器也属于组件,可以容纳各种组件
提供组件遍历、布局管理等附加功能
21
布局管理
顶层窗口wx.Frame、wx.Panel和一般组件的包含关系
22
wx.Frame
wx.Panel
wx.TextCtrl
wx.Button
sizer
灵活布局的解决方案 - sizer
wx.Panel是通过sizer来进行布局管理的
所有的sizer都继承自wx.Sizer类,但wx.Sizer类并不被直接使用,而是使用其各种子类
每个sizer有自己的定位策略
开发者只需要选择合适策略的sizer将窗口组件放入,并且指定好需求即可
23
sizer
sizer本身不是一个容器或一个窗口组件,它只是一个屏幕布局的算法
sizer允许嵌套
wxPython常用的sizer
wx.BoxSizer
wx.FlexGridSizer
wx.GridSizer
wx.GridBagSizer
wx.StaticBoxSizer
24
各种sizer示意
BoxSizer
BoxSizer
GridSizer
FlexGridSizer
所有组件大小一致,固定一个方向,在另外一个方向生长
行高和列宽由最大的组件决定
25
使用sizer的步骤
26
01
03
02
04
05
创建自动调用尺寸的容器panel
创建子窗口(窗体组件)
创建sizer
使用sizer的Add()方法将每个子窗口添加给sizer
调用容器的SetSizerAndFit (sizer)方法
一个基本的sizer使用程序例
# Filename: sizer_example.py
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
button = wx.Button(panel, label = "Click Me")
sizer.Add(button)
panel.SetSizerAndFit(sizer)
File
27
10.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.StatusBar
29
应用程序示例
30
静态文本
按钮
菜单
输入框
列表框
wx.Button及其家族
按钮功能:接受用户的点击事件,触发相应的操作。
常用按钮:
wx.Button:文本按钮
wx.BitmapButton:位图按钮
wx.ToggleButton:开关按钮
绑定处理按钮点击的事件
31
wx.Button
32
# Filename: sizer_example.py
import wx
class 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)用于从一组互斥的选项中,选取其一
33
wx.RadioButton和wx.CheckBox
34
hbox_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)
和用户进行文本双向交换
常用形式:单行,多行,富文本框
35
wx.StaticText和wx.TextCtrl
36
hbox_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模式
37
wx.ListCtrl
38
①选择列表样式
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 = 0
listctrl.InsertItem(pos, "17002001")
listctrl.SetItem(pos, 1, "陈纯")
listctrl.SetItem(pos, 2, "88")
其他组件
创建菜单的wx.Menu
一堆选项中选择的boBox
选择百分比的wx.Slider
39
10.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)
42
File
菜单常用事件
菜单事件
wx.EVT_MENU
# Filename: menudemo.py
#事件处理器
def OnClickBigger(self,e):
pass
def OnClickQuit(self,e):
self.Close()
#绑定事件处理器
self.Bind(wx.EVT_MENU,self.OnClickBigger,biggerItem)
self.Bind(wx.EVT_MENU,self.OnClickQuit,id=wx.ID_EXIT)
43
File
点击窗口出现多个Hello, World!
# Filename: mouse.py
import wx
class 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 loop
44
File
程序示例
45
# Filename: helloworldbtn.py
import wx
class 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.py
import wx
class 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.3
48
小结
常用GUI开发库
在wxPython中创建一个最简单的GUI程序的基本步骤
利用wx.Panel布局管理算法进行布局管理
常用组件介绍及创建方法
利用事件处理函数完成交互
49

展开更多......

收起↑

资源预览