Python图形化界面
一、Python中的图形彷界面开发库
Python中的图形化用户界面开发库有比较多,较为常用的有Tkinter,PyQt,wxPython。
Tkinter
Tkinter是Python官方提供的图形用户界面开发库,用于封装TK GUI工具包,跨平台。官方的这个工具包所包含的控件较少,帮助文档不友好,不便于开发复杂的图形用户界面。
PyQt
非官方提供的,它用于封装Qt工具包,跨平台。如果要想使用PyQt工具包,得需要再安装额外的软件包
wxPython
非官方提供的,跨平台。提供的控制较为丰富,可以用于开发相对复杂的用户界面,帮助文档相对完善友好
二、wxPython安装
在Windows平台上通过pip指令安装wxPython。
三、wxPython第一个实例程序
图形用户界面主要由窗口和控件构成,编写wxPython程序其主要是创建窗口和添加控件的过程。
要构建一个简单的wxPython程序,至少需要一个应用wx.App对象和一个窗口wx.Frame对象
注意上面的事件循环:它是一种事件或消息分发处理机制,大部分图形用户界面在界面中的显示及响应用户事件的处理都是通过主事件循环实现的。
四、自定义窗口类
五、在窗口中添加控件
在窗口中添加“面板”、“静态文本”
一般来说是把控件放到面板上这们有利于布局,如果要把控件直接放到窗口上也是可以的。
六、事件处理
图形界面的控件要响应用户的操作,就必须要添加事件处理机制。一个事件处理包含如下几个内容
1、事件源:事件发生的场所,就是各个控件。比如:按钮事件的事件源就是控钮
2、事件:wxPython中事件被封装为事件类,wx.Event及其子类,按钮事件类是:wx.CommandEvent,鼠标事件类是:wx.MoveEvent
3、事件处理程序:一个响应用户事件的方法
七、布局管理
上面的事件实例中我们的控件写死了指定的位置,这种称为绝对布局,在进行界面布局时尽量不要这样写死布局。
wxPython提供了布局管理器类帮助实现界面布局,主要分为两大类:盒子布局管理器和网络布局管理器。
盒子布局管理器
盒子布局管理器类是:wx.BoxSizer,它是最常用的布局管理器,它可以让其中的子窗口或控件沿垂直或水平方向布局。
盒子布局管理器对象的构造
wx.BoxSizer(wx.HORIZONTAL) # 设置水平布局方向
wx.BoxSizer(wx.VERTICAL) # 设置垂直方向布局
添加子窗口或控件到父窗口
使用wx.BoxSizer对象的Add()方法添加
Add(window,proportion=0,flag=0,border=0) # 添加到父窗口
Add(sizer,proportion=0,flag=0,border = 0) # 添加到另一个布局对象
proportion:用来设置当前子窗口或控件在父窗口中所占的空间比例
flag:布局标志,用来控制对齐方式,边框和调整尺寸
border:用于设置边框的宽度
关于flag标志可以用来设置对齐、边框和调整尺寸
wx.ALIGN_TOP 顶对齐
wx.ALIGN_BOTTOM 底对齐
wx.ALIGN_LEFT 左对齐
wx.ALIGN_RIGHT 右对齐
wx.ALIGN_CENTER 居中对齐
wx.ALIGN_CENTER_VERTICAL 垂直居中对齐
wx.ALIGN_CENTER_HORIZONTAL 水平居中对齐
wx.TOP 设置有顶部边框,连框的宽度由Add方法中的border指定
wx.BOTTN 设置有底部边框
wx.LEFT 设置有左边框
wx.RIGHT 设置有右边框
wx.ALL 设置四边全有边框
wx.EXPAND 调整子窗口或控件完全填满有效空间
wx.SHAPED 调整子窗口或控件填充有效空间,但保持高宽比
wx.FIXED_MINSIZE 调整子窗口或控件为最小尺寸
wx.RESERVE_SPACE_EVEN_IF_HIDDEN 子窗口或控件被 隐藏后所占空间保留
盒子布局管理器还支持嵌套
八、控件
wxPython的所有控件都继承自wx.Control类。之前的示例已经使用了静态文本与按钮,下面我们看一下其它常用的控件
文件输入控件 wx.TextCtrl
复选框和单选按钮
复选框 wx.CheckBox
单选按钮 wx.RadioButton (同一组中多个单选按钮应该是具有互斥性的,当其中一个按钮按下时,其它的要释放)
列表
列表控件 wx.ListBox
静态图片控件
静态图片控件 wx.StaticBitmap
# coding=utf-8
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None,title='静态图片控件',size=(300,300))
self.panel = wx.Panel(parent=self)
self.bmps = [wx.Bitmap('images/img1.bmp',wx.BITMAP_TYPE_ANY),
wx.Bitmap('images/img2.bmp',wx.BITMAP_TYPE_ANY),
wx.Bitmap('images/img3.bmp',wx.BITMAP_TYPE_ANY)]
b1 = wx.Button(self.panel,id=1,label='Buuton1')
b2 = wx.Button(self.panel,id=2,label='Buuton2')
self.Bind(wx.EVT_BUTTON,self.on_click,id=1,id2=2)
self.image = wx.StaticBitmap(self.panel,bitmap=self.bmps[0])
# 创建布局管理器
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(b1,proportion=1,flag=wx.EXPAND)
vbox.Add(b2,proportion=1,flag=wx.EXPAND)
vbox.Add(self.image,proportion=3,flag=wx.EXPAND)
self.panel.SetSizer(vbox)
def on_click(self,event):
event_id = event.GetId()
if event_id == 1:
self.image.SetBitmap(self.bmps[1])
else:
self.image.SetBitmap(self.bmps[2])
self.panel.Layout() # 重置panel面板布局
app = wx.App() # 创建应用程序对象
frm = MyFrame() # 创建窗口对象
frm.Show() # 显示窗口
app.MainLoop() # 进入主事件循环
九、wxPython官文档使用
1、打开wxpython官网
https://wxpython.org
2、打开官方API文档
3、之后就可以找到对应的类查看类信息及相关方法的说明