>>>
了解什么是GUI和常用的GUI框架
了解如何安装GUI框架wxPython
掌握如何使用wxPython框架创建一个应用程序
掌握wxPython框架中提供的常用控件
掌握BoxSizer布局的应用
掌握如何进行事件处理
15.1 初识GUI
15.1.1 什么是GUI
GUI是graphical User Interface(图形用户接口)。
15.1.2 常用的框架
GUI的工具包选择。有很多工具包,
下面讲,wxPython工具包
15.1.3 安装 wxPython
pip install -U wxPython
15.2 创建应用程序
15.2.1 创建一个wx.app 的子类
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.App):
def OnInit(self):
frame = wx.Frame(parent = None, title = 'hello wypython')
frame.Show()
return True
if __name__ == '__main__':
app = MyFrame() # 初始化应用
app.MainLoop() # 调用主循环方法
15.2.2 直接使用wx.App
# -*- coding:utf-8 -*-
import wx
app = wx.App()
frame = wx.Frame(None, title='hello wypython')
frame.Show()
app.MainLoop()
15,2,3 使用wx.Frame框架
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, title = "FrameABC", pos=(100,100), size = (300, 300))
if __name__ == '__main__':
app = wx.App()
frame = MyFrame(parent=None, id = -1)
frame.Show()
app.MainLoop()
15.3 常用控件
15.3.1 staticText文本类
wx.StaticText(parent, id, label, pos, size, style, name)
wx.Font(pointSize, family, style, weight, underline(win系统有效,表下划线), faceName, encoding)
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self, parent, id, title = "创建StaticText类",
pos=(100, 100), size=(600, 300))
panel = wx.Panel(self) # 创建画板
# 创建标题,并设置字体
title = wx.StaticText(panel, label='Python之禅——Tim Peters',pos=(100,20))
font = wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
title.SetFont(font)
# 创建文本
wx.StaticText(panel, label='优美胜于丑陋',pos=(50,50))
wx.StaticText(panel, label='明了胜于晦涩',pos=(50,70))
wx.StaticText(panel, label='简洁胜于复杂',pos=(50,90))
wx.StaticText(panel, label='复杂胜于凌乱',pos=(50,110))
wx.StaticText(panel, label='扁平胜于嵌套',pos=(50,130))
wx.StaticText(panel, label='间隔胜于紧凑',pos=(50,150))
wx.StaticText(panel, label='可读性很重要',pos=(50,170))
if __name__ == '__main__':
app = wx.App() # 初始化应用
frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
frame.Show() # 显示窗口
app.MainLoop() # 调用主循环方法
15.3.2 TextCtrl 输入文本类
wx.textCtrl(parent, id, value = "", pos, size, style(对齐方式), validator(过滤数据,确保得到想要的数据), name)
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",size=(400, 300))
#创建面板
panel = wx.Panel(self)
# 创建文本和输入框
self.title = wx.StaticText(panel ,label="请输入用户名和密码",pos=(140,20))
self.label_user = wx.StaticText(panel,label="用户名:",pos=(50,50) )
self.text_user = wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel,pos=(50,90),label="密 码:")
self.text_password = wx.TextCtrl(panel,pos=(100,90),size=(235,25),style=wx.TE_PASSWORD)
if __name__ == '__main__':
app = wx.App() # 初始化应用
frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
frame.Show() # 显示窗口
app.MainLoop() # 调用主循环方法
15.3.3 Button 按钮类
wx.Button(parent, id, label, size, style, validator, name) # 同上
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",size=(400, 300))
#创建面板
panel = wx.Panel(self)
# 创建文本和输入框
self.title = wx.StaticText(panel ,label="请输入用户名和密码",pos=(140,20))
self.label_user = wx.StaticText(panel,label="用户名:",pos=(50,50) )
self.text_user = wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel,pos=(50,90),label="密 码:")
self.text_password = wx.TextCtrl(panel,pos=(100,90),size=(235,25),style=wx.TE_PASSWORD)
self.lable_check = wx.StaticText(panel, label='验证码:',pos=(50, 130))
self.text_check = wx.TextCtrl(panel, pos=(100, 130), size=(235,25),style=wx.TE_LEFT)
self.bt_confirm = wx.Button(panel, label='确定', pos = (105, 170))
self.bt_confirm = wx.Button(panel, label='取消', pos=(195, 170))
if __name__ == '__main__':
app = wx.App() # 初始化应用
frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
frame.Show() # 显示窗口
app.MainLoop() # 调用主循环方法
15.4 BoxSizer布局
wxPython提供了5个Boxsizer,
BoxSizer布局, GridSizer布局, FlexGridSizer布局, GridBagSizer布局,StaticBoxSizer布局。
15.4.1 什么是BoxSizer
是一个垂直列或水平列的的组件。
15.4.2 使用BoxSizer布局
panel = wx.panel(self)
self.title = wx.StaticText(panel, label='请输入用户名和密码')
vsizer = wx.BoxSizer(wx.VERTICAL)
vsizer.Add(self.title, proportion = 0, flag = wx.ALL, border = 15)
panel.SetSizer(vsizer)
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",pos = (100, 100),size=(400, 300))
panel = wx.Panel(self)
self.title = wx.StaticText(panel, label = "请输入用户名和密码")
# 确认和取消按键
self.bt_confirm = wx.Button(panel, label = "确认")
self.bt_cancel = wx.Button(panel, label="取消")
#
# #用户名,和对应的输入框
self.user = wx.StaticText(panel, label = '用户名 : ')
self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
self.user_pwd = wx.StaticText(panel, label='密 码 : ')
self.text_user_pwd = wx.TextCtrl(panel, style=wx.TE_LEFT)
#
# hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
# hsizer_user.Add(self.user, proportion = 0, flag = wx.ALL, border = 5)
# hsizer_user.Add(self.text_user_pwd, proportion = 0, flag = wx.ALL, border = 5)
# 确认取消的框架
vsizer_1 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_1.Add(self.bt_confirm, proportion = 0, flag = wx.ALL, border = 5)
vsizer_1.Add(self.bt_cancel, proportion = 0, flag = wx.ALL, border = 5)
# user 的 框架
vsizer_2 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_2.Add(self.user, proportion=0, flag=wx.ALL, border=5)
vsizer_2.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
# pwd 的 框架
vsizer_3 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_3.Add(self.user_pwd, proportion=0, flag=wx.ALL, border=5)
vsizer_3.Add(self.text_user_pwd, proportion=1, flag=wx.ALL, border=5)
vsizer_all = wx.BoxSizer(wx.VERTICAL)
vsizer_all.Add(self.title, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
vsizer_all.Add(vsizer_2, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 15)
vsizer_all.Add(vsizer_3, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border=15)
vsizer_all.Add(vsizer_1, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER, border=15)
panel.SetSizer(vsizer_all)
if __name__ == '__main__':
app = wx.App() # 初始化应用
frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
frame.Show() # 显示窗口
app.MainLoop() # 调用主循环方法
15.5 事件处理
15.5.1 什么是事件
用户执行的动作就叫作事件(event)
15.5.2 绑定事件
bt_confirm.Bind(wx.EVT_BUTTON, OnclickSubmit)
# -*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self, parent,id, title="创建TextCtrl类",pos = (100, 100),size=(400, 300))
panel = wx.Panel(self)
self.title = wx.StaticText(panel, label = "请输入用户名和密码")
# 确认和取消按键
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.user = wx.StaticText(panel, label = '用户名 : ')
self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
self.user_pwd = wx.StaticText(panel, label='密 码 : ')
self.text_user_pwd = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
#
# hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
# hsizer_user.Add(self.user, proportion = 0, flag = wx.ALL, border = 5)
# hsizer_user.Add(self.text_user_pwd, proportion = 0, flag = wx.ALL, border = 5)
# 确认取消的框架
vsizer_1 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_1.Add(self.bt_confirm, proportion = 0, flag = wx.ALL, border = 5)
vsizer_1.Add(self.bt_cancel, proportion = 0, flag = wx.ALL, border = 5)
# user 的 框架
vsizer_2 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_2.Add(self.user, proportion=0, flag=wx.ALL, border=5)
vsizer_2.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
# pwd 的 框架
vsizer_3 = wx.BoxSizer(wx.HORIZONTAL)
vsizer_3.Add(self.user_pwd, proportion=0, flag=wx.ALL, border=5)
vsizer_3.Add(self.text_user_pwd, proportion=1, flag=wx.ALL, border=5)
vsizer_all = wx.BoxSizer(wx.VERTICAL)
vsizer_all.Add(self.title, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
vsizer_all.Add(vsizer_2, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 15)
vsizer_all.Add(vsizer_3, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border=15)
vsizer_all.Add(vsizer_1, proportion=0, flag=wx.ALL | wx.ALIGN_CENTER, border=15)
panel.SetSizer(vsizer_all)
def OnclickSubmit(self, event):
''' 单击确认事件'''
message = 'abc'
username = self.text_user.GetValue()
password = self.text_user_pwd.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_user_pwd.SetValue("")
if __name__ == '__main__':
app = wx.App() # 初始化应用
frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数
frame.Show() # 显示窗口
app.MainLoop() # 调用主循环方法