1.GUI常用库
①标准库:tkinter
②扩展库:wxPython、PyGObject、PyQt、PySide
2.wxPython
①使用方法:
a)首先导入wxPython包;
import wx
b)然后建立框架类,框架类的父类名字为wx.Frame,在框架类构造函数种要初始化父类,然后为子类添加各种控件以及1处理办法
class myFrame(wx.Frame): #继承父类
def __init__(self,superior):
wx.Frame.__init__(self,parent=superior,title=u'My First Form',size=(300,300))
c)最后建立主程序,创建应用程序对象、创建框架类对象、显示框架、开始事件循环;执行子类.Show(True)后,框架才可以看见,执行app.MainLoop()后才可以接收并处理事件
if __name__=='__main__':
#创建应用程序
app=wx.App()
#创建框架类对象
frame=myFrame(None)
#显示框架
frame.Show(True)
#使得控件可以接收和处理事件
app.MainLoop()
②第一个GUI程序:
a)框架类的构造函数:
class myFrame(wx.Frame): #继承父类
def __init__(self,superior):
wx.Frame.__init__(self,parent=superior,title=u'My First Form',size=(300,300)) #调用父类初始化自己的框架
#为按钮绑定事件自己的事件,改变大小和移动窗体
self.Bind(wx.EVT_SIZE,self.OnSize)
self.Bind(wx.EVT_MOVE,self.OnFrameMove)
#添加一个pane和一些控件来展示位置和大小
panel=wx.Panel(self,-1)
label1=wx.StaticText(panel,-1,'FrameSize:')
label2=wx.StaticText(panel,-1,'FramePos:')
label3=wx.StaticText(parent=panel,label='MousePos:')
#初始化窗体大小,位置和鼠标位置
self.sizeFrame=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
self.posFrame=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
self.posMouse=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
panel.Bind(wx.EVT_MOTION,self.OnMouseMove) #绑定事件处理函数
self.panel=panel
#为窗体的布局设置样式
sizer=wx.FlexGridSizer(3,2,5,5)
sizer.Add(label1)
sizer.Add(self.sizeFrame)
sizer.Add(label2)
sizer.Add(self.posFrame)
sizer.Add(label3)
sizer.Add(self.posMouse)
#边框设置
border=wx.BoxSizer()
border.Add(sizer,0,wx.ALL,15)
panel.SetSizerAndFit(border)
self.Fit()
b)框架类的事件
def OnSize(self,event): #设置窗体的大小
size=event.GetSize()
print('打印窗体大小:',size,end='\n')
self.sizeFrame.SetValue("%s,%s"%(size.width,size.height))
event.Skip()
def OnFrameMove(self,event): #窗体1移动事件处理函数
pos=event.GetPosition()
print('打印窗体位置:',pos,end='\n')
self.posFrame.SetValue("%s,%s"%(pos.x,pos.y))
def OnMouseMove(self,event): #鼠标移动事件处理函数
pos = event.GetPosition()
print('打印鼠标位置:',pos,end='\n')
self.posMouse.SetValue("%s,%s" % (pos.x, pos.y))
c)主程序
if __name__=='__main__':
#创建应用程序
app=wx.App()
#创建框架类对象
frame=myFrame(None)
#显示框架
frame.Show(True)
#使得控件可以接收和处理事件
app.MainLoop()
d)运行结果
③代码分析
a)父类构造函数
parent:框架的父窗体,值为None时表示创建顶级窗体
id:新窗体的wxPythonID号,可以明确传递一个唯一的ID,值为-1时,wxPython自动生成一个ID
title:窗口的标题
pos:用来指定新窗体的左上角在屏幕中的位置,通常(0,0)表示屏幕左上角的位置;DefaultPosition=(-1,-1)表示有系统决定位置
size:指定新窗体初始大小,当其为DefaultSize=(-1,-1)时,表示由系统来决定初始化大小
style:指定窗体类型的常量,有多种样式
name:框架的名字,指定后可以通过名字来寻找窗体
b)常用style参数设置
添加标题栏:wx.CAPTION
默认样式:wx.DEFAULT_FRAME_STYLE
关闭按钮:wx.CLOSE_BOX
最大化按钮:wx.MAXIMIZE_BOX
最小化按钮:wx.MINIMIZE_BOX
边框可以改变尺寸:wx.RESIZE_BORDER
边框没有装饰SIM:wx.PLE_BORDER
增加系列菜单:wx.SYSTEM_MENU
创建非矩形窗体:wx.FRAME_SHAPED
设置工具框:wx.FRAME_TOOL_WINDOW
使用方法可以叠加使用:
style=wx.FRAME_TOOL_WINDOW|wx.FRAME_SHAPED|wx.RESIZE_BORDER
不能改变窗体的大小和缩放
学习笔记:
1.使用wxPython创建窗体的三个步骤;
2.style样式设置可以叠加使用;
3.name属性值指定后可以原来搜索窗体;
4.在初始化窗体时可以明确传递一个ID,如果无法确定使用哪一个ID,可以通过wx.NewId()方法来生成ID,避免确保ID唯一性的麻烦;
id=wx.NewId()
frame=wx.Frame.__init__(None,id)
也可以使用全局变量来实现创建ID
wx.ID_ANY(值为-1)
通过GetId()方法来查看ID
frame=wx.Frame.__init__(None,-1)
id=frame.GetId()