GUI简介
GUI是Graphical User Interface(图形用户界面)的缩写。在GUI中,并不只是输入文本和返回文本,用户可以看到窗口、按钮、文本框等图形,而且可以用鼠标单击,还可以通过键盘输入。GUI是与程序交互不同的一种方式。GUI有三个基本要素:输入、处理和输出。
工具包 | 描述 |
wxPython | python语言的一套GUI图形库,可以方便地创建完整的GUI用户界面 |
Kivy | 开源工具包,能让相同源代码创建的程序跨平台运行 |
Flexx | 纯python工具包,用来创建图形化界面应用程序。使用Web技术进行界面的渲染 |
PyQt | 是Qt库的python版本,支持跨平台 |
Tkinter | 是TK图形用户界面工具包标准的python接口。TK是一个轻量级的跨平台图形GUI开发工具 |
Pywin32 | 允许用户像VC一样使用python开发win32应用 |
PyGTK | 让用户轻松创建具有图形用户界面的程序 |
pyui4win | 开源的采用自绘技术的界面库 |
使用wx.Frame框架
在GUI中,框架通常也成为窗口。在wxPython中,wx.Frame是所有框架的父类。当用户创建wx.Frame的子类时,子类应该调用父类的构造器wx.Frame.____init()。wx.Frame的构造器语法格式如下
wx.Frame(parent,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME _STYLE,name="frame")
parent:框架的父窗口,如果是顶级窗口,这个值是None
id:关于新窗口的wxPythonID号。通常设为-1,让wyPython自动给生成一个新的id
title:窗口的标题
pos:一个wx.Point对象,它指定这个新窗口的左上角在屏幕中的位置。在图形用户界面程序中,通常(0,0)是显示器的左上角。这个默认的(-1,-1)将让系统决定窗口的位置。
size:一个wx.Size对象,它指定这个窗口的初始尺寸。默认的(-1,-1)将让系统决定窗口的初始尺寸。
style:指定窗口的类型的常量。可以使用或运算来组合它们。
name:框架的内在的名字,可以用它来寻找这个窗口。
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self,parent,id,title = "创建Frame",pos = (100,100), size= (300,300))
if __name__ == '__main__':
app = wx.App()
frame = MyFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()
结果如下:
StaticText文本类
对于所有的UI工具来说,最基本的任务就是在屏幕上绘制纯文本。在wxPython中,可以使用wx.StaticText类来完成。使用wx.StaticText能够改变文本的对齐方式、字体和颜色等。构造函数语法如下:
wx.StaticText(parent,id,label,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,name="staticTex t")
parent:父窗口插件
id:使用-1可以自动创建一个唯一的标识
label:显示在静态控件中的文本内容
pos:一个wx.Point或者一个Python元组,它是窗口部件的位置
size:一个wxSize或者一个Python元组,它是窗口部件的尺寸
style:样式标记
name:对象的名字
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title="创建StaticText类",pos=(100,100),size=(600,400))
panel = wx.Panel(self)#创建画板
#创建标题,并设置字体
title = wx.StaticText(panel,label="python",pos=(100,20))
font = wx.Font(16,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
title.SetFont(font)
#创建文本
wx.StaticText(panel,label='人生苦短,我用python',pos=(50,50))
if __name__ == '__main__':
app = wx.App()#初始化应用
frame = MyFrame(parent=None, id=-1)#实例化MyFrame类,并传递参数
frame.Show()#显示窗口
app.MainLoop()#调用主循环方法
TextCtrl输入文本类
wx.wx.StaticText只能用于显示纯粹的静态文本,但是有时需要输入文本与用户进行交互,此时需要TextCtrl文本类,它允许输入单行和多行文本,也可以作为密码输入控件,掩饰所按下的按键。
wx.TextCtrl(parent,id,value="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,validator=wx.D efaultValidator,name=wx.TextCtrlNameStr)
style:单行wx.TextCtrl的样式
- wx.TE_CENTER:控件中的文本居中
- wx.TE_LEFT:控件中的文本左对齐,默认行为
- wx.TE_NOHIDESEL:文本始终高亮显示,只适用于windows系统
- wx.TE_PASSWORD:不显示输入的文本,以*代替
- wx.TE_PROCESS_ENTER:如果使用该参数,那么当用户在控件内按Enter键时,一个文本输入事件将被触发。否 则,按键事件内在的由该文本控件或该对话框管理。
- wx.TE_PROCESS_TAB:如果指定了这个样式,那么通常的字符事件在Tab键按下时创建。否则tab由对话框来管理,通常是控件间的切换。
- wx.TE_READONLY:文本控件只为可读,用户不能修改其中的文本。
- wx.TE_RIGHT:控件中的文本右对齐。
value:显示在该控件中的初始文本
validator:常用于过滤数据以确保只能输入要接受的数据
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title="创建",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.label_pwd= wx.StaticText(panel, label="密 码", pos=(50, 90))
self.text_user=wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
self.text_user = 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)
frame.Show()
app.MainLoop()
Button按钮类
按钮时GUI界面中应用最广泛的控件,它常用于捕获用户生成的单击事件,其最明显的用途是触发绑定到一个处理函数。
wx.Button(parent,id,label,pos,size=wxDefaultSize,style=0,validator,name="button")
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title="创建",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.label_pwd= wx.StaticText(panel, label="密 码", pos=(50, 90))
self.text_user=wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
#创建“确定”和"取消"按钮
self.bt_confirm = wx.Button(panel, label='确定',pos=(105,130))
self.bt_cancel = wx.Button(panel,label='取消',pos=(195,130))
if __name__=='__main__':
app=wx.App()
frame=MyFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()
BoxSizer
wxPython提供了5个Sizer,BoxSizer是其中最简单和灵活的。
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.title=wx.StaticText(panel, label="请输入用户名和密码")
#添加容器,容器中控件按纵向排列
v=wx.BoxSizer(wx.VERTICAL)
v.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=15)
panel.SetSizer(v)
if __name__=='__main__':
app=wx.App()
frame=MyFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()
Add()语法格式如下:
Box_Add(control,proportion,flag,border)
control:要添加的控件
proportion:所添加控件在定义的定位方式所代表方向上占据的空间比例。如果有3个按钮,它们的比例分别是0、1和2,它们都已经添加到一个宽度为30的水平排列wx.BoxSizer,起始宽度都是10.当sizer的宽度从30变成60时,按钮1的宽度保持不变,仍然是10,按钮2的宽度变为20,按钮3的宽度变为30
flag:flag参数与border参数结合使用可以指定边距宽度:
- wx.LEFT:左边距
- wx.RIGHT:右边距
- wx.BOTTOM:底边距
- wx.TOP:上边距
- wx.ALL:上下左右四个边距
可以通过竖线“|”操作符来联合使用这些标志,比如wx.LEFT|WX.BOTTOM.
flag还可以与proportion参数结合,指定控件本身的对齐方式:
- wx.ALIGN_LEFT:左边对齐
- wx.ALIGN_RIGHT:右边对齐
- wx.ALIGN_TOP:顶部对齐
- wx.ALIGN_BOTTOM:底边对齐
- wx.ALIGN_GENTER_VERTICAL:垂直对齐
- wx.ALIGN_GENTER_HORIZONTAL:水平对齐
- wx.ALIGN_GENTER:居中对齐
- wx.EXPAND:所添加控件将占有sizer定位方向上所有可用的空间
- border:控制所添加控件的边距,就是在部件之间添加一些像素的空白
事件处理
用户执行的动作就叫作事件,比如单击按钮就是一个单击事件
利用控件的Bind()方法可以将事件处理函数绑定到给定的事件上。例如,为“确定”按钮添加一个单击事件,代码如下:
bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)
wx.EVT_BUTTON:事件类型为按钮类型。
wx.EVT_MOTION:用户移动鼠标。
wx.ENTER_WINDOW:用户进入窗口控件
wx.LEAVE_WINDOW:用户离开窗口控件
wx.EVT_MOUSEWHEEL:鼠标滚轮滑动
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='确定', pos=(105, 130))
self.bt_cancel = wx.Button(panel, label='取消', pos=(195, 130))
self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
self.bt_cancel.Bind(wx.EVT_BUTTON, self.OnclickCancel)
self.title = wx.StaticText(panel, label="请输入用户名和密码", pos=(140, 20))
self.label_user = wx.StaticText(panel, label="用户名", pos=(50, 50))
self.label_pwd = wx.StaticText(panel, label="密 码", pos=(50, 90))
self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT)
self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)
def OnclickSubmit(self,event):
message=""
username=self.text_user.GetValue()
password = self.text_password.GetValue()
if username=="" or password=="":
message="用户名或密码不能为空"
elif username =="mr" or 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()