wxpython内容简介
创建最小的wxpython程序
wxpython基础:创建和使用应用程序的对象,定向程序的输出,关闭应用程序,增加对象
事件驱动:创建自己的事件,将事件绑定到处理器上,如何处理事件驱动,应用程序属性
使用PyCrust:如何与wxpython的程序交互,PyCrust的特性
创建你的蓝图:重构,如何保持model与view分离,如何对一个GUI程序进行单元测试
使用基本的构造部件:在屏幕上绘画,添加窗口装饰,得到标准信息,程序外观
使用基本的控件工作:显示文本,使用按钮,输入并显示数字,给用户选择
把窗口部件放入框架中:框架的寿命,使用框架,使用分割窗口
对话框:使用模式对话框,使用标准对话框,创建向导,显示启动提示,使用验证器
创建和使用wxpython菜单:创建菜单,使用菜单项工作,菜单设计的适用性准则
使用size放置窗口部件:基本的grid sizer,使用其他类型的sizer
处理基本的图像:使用图像工作,处理设备上下文,图像处理
建造列表控件并管理项目
网格控件
树形控件
在你的程序中加入HTML
wxpython的打印架构
其它功能:放置对象到剪贴板,拖放,传送自定义对象,使用wx.Time来设置定时事件
创建多线程的wxpython的应用程序
wyphon基础
1. Application object(程序对象) Top-Level Window(顶级窗口对象)
应用程序对象管理主事件循环,启动主事件循环
顶级窗口管理数据并呈现给用户,顶级窗口管理其窗口中的组件和分配给他的数据对象。
窗口和他的组件的触发事件基于用户的动作,并接受事件的通知以便改变显示。
2. 任何wxpython应用程序都需要一个应用程序对象,这个应用程序对象必须是类WX.App或其定制的子类的一个实例。每个wxpython程序必须有一个application对象和至少一个frame对象,创建一个wxpython的子类如下:
定义这个子类
在定义的子类中写一个OnInit()方法
在程序的主要部分创建这个类的一个实例
调用应用程序实例的MainLoop()方法
3. 程序对象的生命周期
wxPython应用程序对象的生命周期开始于应用程序实例被创建时,在最后一个应用程序窗口关闭时结束。
4.使用wx.python
框架就是用户通称的窗口,框架是一个容器,他包括,标题栏,菜单栏等
wx.Frame是所有框架的父类,也有少数专用的子类。
wx,Frame的构造器的要求的参数如下:
wx.Frame(parent,id=-1,title=””,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYLE,name=”frame”)
name:窗口的内在名字,以后你可以使用它来寻找这个窗口。
这些参数将被传递给父类的构造器方法:wx.Frame.init()
5.创建wx.Frame子类的方法:
class MyFrame(wx.Frame):
def__init__(self):
wx.Frame.init(self,None,-1,”MyFriendlyWindow”,(100,100),(100,100))
6.使用wxPython的ID
创建一个窗口部件使用的ID号
明确地给构造器传递一个正的整数
使用wx.NewId()函数
传递一个全局常量wx.ID_ANY或-1给窗口部件的构造器
7.使用wx.Size和wx.Point
wx.Point表示一个点或位置,可以使用set(x,y)和Get()函数来说设置得到x和y值。Get()函数返回一个元组。如果坐标值是浮点数坐标,可以使用wx.RealPoint.
wx.Size(width,height)
eg: frame = wx.Frame(None,-1,pos=(10.10),size=(100,100))
8. 使用wx.Frame的样式
在窗口部件创建后改变它的样式,可以使用SetStyle()方法,所有能使用的样式元素都有一个常量标识符,例如:wx.MINIMIZE_BOX,如果是使用多个样式,你可以使用或运算符|。要从一个合成样式中去掉个别的样式,你可以使用^操作符。
wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX | wx.RESIZE_BORDER |
wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX
|wx.MAXIMIZE_BOX)
wx.CAPTION:在框架上增加一个标题栏,它显示该框架的标题属性。
wx.CLOSE_BOX:指示系统在框架的标题栏上显示一个关闭框,使用系统默认的位
置和样式。
wx.DEFAULT_FRAME_STYLE:默认样式。
wx.FRAME_SHAPED:用这个样式创建的框架可以使用SetShape()方法去创建一个
非矩形的窗口。
wx.FRAME_TOOL_WINDOW:通过给框架一个比正常更小的标题栏,使框架看起
来像一个工具框窗口。在Windows下,使用这个样式创建的框架不会出现在显示所
有打开窗口的任务栏上。
wx.MAXIMIZE_BOX:指示系统在框架的标题栏上显示一个最大化框,使用系统默认
的位置和样式。
wx.MINIMIZE_BOX:指示系统在框架的标题栏上显示一个最小化框,使用系统默认
的位置和样式。
wx.RESIZE_BORDER:给框架增加一个可以改变尺寸的边框。
wx.SIMPLE_BORDER:没有装饰的边框。不能工作在所有平台上。
wx.SYSTEM_MENU:增加系统菜单(带有关闭、移动、改变尺寸等功能)和关闭
框到这个窗口。在系统菜单中的改变尺寸和关闭功能的有效性依赖于wx.MAXIMIZE_BOX, wx.MINIMIZE_BOX和wx.CLOSE_BOX样式是否被应用。
9. 如何为一个对象增加对象和子窗口
类InsertFrame的方法init创建了子窗口
在wxpython中,你只需要在窗口被创建时指定父窗口,这个窗口就隐式地增加到父对象中了。使用sizers的对象来管理子窗口的复杂布局。
10. 使用对话框
消息对话框:wx.MessageDialog(parent,message,caption=”Message box”,style=wx.OK|WX.CANCLE,pos=wx.DefaultPosition), message:显示在对话框的字符串,caption:显示在对话框标题的字符串,ShowModal()方法将对话框以模式框架的方式显示,对话框关闭之前,应用程序不能响应别的事件。ShowModal()方法的返回值是一个整数,对于wx.MessageDialog,返回值是下面常量之一: wx.ID_YES, wx.ID_NO, wx.ID_CANCEL, wx.ID_OK。
文本输入对话框
dlg = wx.TextEntryDialog(None, ”Who is buried in Grant’s tomb?”,’A Question’, ’Cary Grant’)if dlg.ShowModal() == wx.ID_OK:response = dlg.GetValue()
从一个列表中选择
dlg = wx.SingleChoiceDialog(None,’What version of Python are you using?’,
’Single Choice’,[‘1.5.2’, ’2.0’, ’2.1.3’, ’2.2’, ’2.3.1’],
if dlg.ShowModal() == wx.ID_OK:
response = dlg.GetStringSelection()
11. wxpython一些规则
任何wxpython应用程序都需要去实例化一个wx.App,并且知道有一个顶级窗口
应用程序对象包含OnInit()方法,它在启动的时候被调用。在这个方法中通常要初始化框架和别的全局对象。
应用程序对象也控制文本输出的位置
一个wx.pyhon应用程序通常至少有一个wx.Frame子类
12. 如何创建一个列表控件
wx.ListCtrl(parent,id,pos=wx.DefaultPosition,size=wx.DefaultSize, style=wx.LC_ICON,validator=wx.DefaultValidator, name=”listCtrl”)
列表控件模式值
wx.LC_ICON:图标模式,使用大图标
wx.LC_LIST:列表模式
wx.LC_REPORT:报告模式
wx.LC_SMALL_ICON:图标模式,使用小图标报告列表的显示样式
wx.LC_HRULES:在列表的行与行间显示网格线(水平分隔线)
wx.LC_NO_HEADER:不显示列标题
wx.LC_VRULES:显示列与列之间的网格线(竖直分隔线)
13.在屏幕上画图
使用device context 抽象的wxpython的类wx.DC和其子类
设备上下文用来在WxPython窗口部件上绘图,他应该是局部的临时的,不应该是以实例变量,全局变量或其他形式在方法调用之间保留
14.使用sizer
sizer被附加到一个容器,通常是一个框架或面板,在父容器中创建的子窗口部件必须被分别地添加到sizer。当sizer被附到容器后就管理它所包含的孩子的布局。所有sizer都是抽象类wx.Sizer的一个子类的实例。sizer知道每个孩子的最小尺寸。
Grid:窗口部件尺寸相同
Flex grid:窗口部件不同尺寸,会有调整
Grid bag:窗口部件可以随意布置
Box:在一条水平或垂直的线分割那个的窗口的布局
Static box:一个标准的box sizer,带有标题和环线。
使用sizer的三个基本步骤:
创建并关联sizer到一个容器。SetSizer(sizer)方法。
添加每个孩子到这个sizer。Add()。
使sizer 能够计算它的尺寸。通过在父窗口对象调用wx.Window的Fit()方法,和sizer的Fit(Window)。
15.sizer
1). 基本的sizer
wx.GridSizer(rows,cols,vgap,hgap)
添加或删除孩子:
Add(window, proportion=0, flag=0, border=0, userData=None)
Add(sizer, proportion=0, flag=0, border=0, userData=None)
Add(size, proportion=0, flag=0, border=0, userData=None)
flag参数用于放置位标记,控制对齐,边框,和调整尺寸。
wx.ALIGN_BOTTOM:按照窗口部件被分配的空间(格子)的底部对齐。
wx.ALIGN_CENTER:放置窗口部件,使窗口部件的中心处于其所分配的空间的中心。
wx.ALIGN_CENTER_HORIZONTAL:在它所处的格子中,水平居中。
wx.ALIGN_CENTER_VERTICAL :在它所处的格子中,垂直居中。
wx.ALIGN_LEFT:靠着它所处的格子左边缘。这是默认行为。
wx.ALIGN_TOP:靠着它所处的格子的上边缘。这是默认的行为。
wx.EXPAND:填满它所处的格子空间。
wx.FIXED_MINSIZE:保持固定项的最小尺寸。
wx.GROW:与wx.EXPAND相同。但比之少两个字符,节约了时间。
wx.SHAPED:窗口部件的尺寸改变时,只在一个方向上填满格子,另一个方向上按部件原先的形状尺寸的比列填充。
将新窗口插入到size中不同的位置
Insert(index,window,proportion=0, flag=0, border=0,userData=None)
Insert(index, sizer, proportion=0, flag=0, border=0,userData=None)
Insert(index, size, proportion=0, flag=0, border=0, userData=None)
将新的窗口部件,sizer或空白添加到size的列表的开头
Prepend(window, proportion=0, flag=0, border=0, userData=None)
Prepend(sizer, proportion=0, flag=0, border=0, userData=None)
Prepend(size, proportion=0, flag=0, border=0, userData=None)
从sizer中移除一项
Detach(window)
Detach(sizer)
Detach(index)
2). flex grid sizer
wx.FlexGridSizer(rows, cols, vgap, hgap)
AddGrowableCol(idx, proportion=0)
AddGrowableRow(idx, proportion=0)
3). grid bag sizer
能够将一个窗口添加到一个特定的单元格
能够将一个窗口部件跨越几个单元格
Add(window,pos,span=wx.DefaultSpan,flag=0,border=0,userData=Non)
Add(sizer,pos,span=wx.DefaultSpan,flag=0,border=0,userData=None)
Add(size,pos,span=wx.DefaultSpan,flag=0,border=0,userData=None)
AddItem(item)
4). box size
wx.BoxSizer(orient) orient代表该size的方向,它的取值可以是wx.VERTICAL或wx.HORIZONTAL
5). static box sizer
wx.StaticBoxSizer(box,orient)
16.wxpython GUI构建工具
wxFormBuilder
17.wxpython 的类
Frame
panel
Static Text
TextCtrl
RadioButton&RadioBox
CheckBox
ComboBox&Choice
Guage(进度条)
Slider(滑块)
dialog:MessageDialog,FileDialog,FrontDialog.
18.在屏幕上绘图
要在屏幕上绘画,我们要用一个名为device context(设备上下文)的wxpyton对象。
设备上下文使用抽象的wxPython的类wx.DC和其子类来代表。由于wx.DC是抽象的,所以对于你的应用程序,需要使用它的子类。device context用来在wxPython窗口部件上画图,它应该是局部的,临时的,不应该是实例变量,全局变量,或其他形式在方法调用之间保留。
wx.BufferedDC
wx.BufferedPaintDC
wx.ClientDC
19.树形控件
1).树控件是类wx.TreeCtrl的实例,如果实现自定义排序需要子类化wx.TreeCtrl
2).AddRoot(text,image=-1,selImage=-1,data=None)该函数的返回值是一个代表树的root项目的wx.TreeItemId.得到root项,可以用方法AppendItemI(parent,text,image=-1,selImage=-1,data=None)来添加子项目,参数parent是父项目的ID。
3).数控件有一些用来改变树的显示外观的样式。一套是用来控制展开或折叠。令一套是用来控制项目间的连接线的。第三套是用来用于控制树树单选还是多选。也可以隐藏树的实际root.
4).SetItemPyData(item,obj)它给项目分配一个任意的python对象。
5).树控件使用一个图像类表来管理图像。可以使用SetImageList(imageList)来分配一个图像列表控件给树控件。
6).遍历子项目类表,可以使用方法GetFirstChild(item)
如何编辑树形控件中的项目以及如何响应用户事件:
创建树self.tree=wx.TreeCtrl(self)
添加根节点root=self.tree.AddRoot(“wx.Object”)
从我们的数据集合中添加nodes self.AddTreeNodes(root,data.tree)
绑定一些事件
我的总结:
1. 事件驱动,一个消息绑定一个事件,需要定义 type, id, function
2.frame, pannel,只有frame 可以继承属性,pannel上可以添加list,button,table, tree, menu等
3.窗口布局,标题栏,菜单栏,最大化,最小化,关闭按钮等已经封装 ,也可以重载
4.图片显示,是存放在硬盘中的编码,规定每个坐标的显示,再通过显卡显示在屏幕上
5.主函数main,主事件循环,app.MainLoop
6.AuiManager, 管理pannael
7.所有控件都可以看做一个子窗口,所有窗口都是继承容器和框架的属性,按钮等控件不可以在上面再添加控件是因为没有继承容器的属性。
所有窗口都是三个属性:位置,大小,id,窗口继承,子窗口是相对于父窗口的位置。如果一个窗口的继承parent方法为None,则其就是框架。
8.构造函数,传递方法
9.添加panel必须在框架构造函数之后,与程序执行顺序有关。文本框影响panel位置。
10.构造函数,初始化参数,不写则为默认参数,也可不按顺序,但必须明确参数指定的内容。
11.wxpython运行刷新了,写入,显示。
12.加载图片,要先把图片路以及图片名称载入,要指定图片格式,把图片文件存储在一个列表中,调用onpaint方法,画图,刷新,显示。
13.编写代码顺序,先有列表元素,再添进panel,再引用auimanager管理panel。向一个窗口中添加,必须先构造他。如给一个列表添加内容,先要定义它的构造函数。要管理自己的框架,在里添加控件,必须要自己定义一个类,实例化一个对象,直接继承的只是一个空的框架。
14.self作用,如果临时变量则不用加self,这个函数调用完了就自动销毁。要理解一个变量的作用域,全局变量时在不同函数中都可以调用的。
15.引入水平布局和垂直布局,也可引入栅格布局对齐。栅格布局可以定义每行排列多少个对象。BoxSizer是二维平面,有水平方向和垂直方向,可以用wx.EXPAND拉伸。
16.列表遍历,元组使用。
17.关于调试代码总结问题:
如何读程序,明确代码结构,运行过程
明确每个函数,以及方法的用途
思考逻辑对不对,胸有成竹,再运行代码
报错问题总结,知道每种报错是什么意思
总结分析问题的方法,如排除法,缩小范围,试错等
思考有没有更好更简单的方法,方便后期维护
18. wxpython中destroy()和close()以及绑定一个事件onclose()是有区别的。
19. 多线程,一般主线程结束,子线程也结束,主线程先开始,也有特殊情况,主线程关闭,子线程没有结束。定义一个类,实例化类,初始化类,start(),调用start()运行线程。子线程可以包含在run()方法内。每个线程最多有一个app().每个app()都是独立的窗口,互不影响。
20. 内存泄露,一段代码运行,要分配一个存储空间,结束的时候要释放掉,如果直接退出进程,关闭,会造成该分配的内存无法让别的程序使用,直到异常退出的程序再次运行,重新利用此段内存,正常结束的时候再释放。
21. 面向对象的本质,同类的对象封装到一起。方便添加属性和维护。如何调用类中的函数,一般调用的是实例后的方法中的函数。如何调用其它类中的方法?
把功能相似的代码放在一起,新建一个类,注意新方法的self指代问题,新建的类,除了必须传递的self参数外,还需要传递第二个参数是parent,指代的是父框架,继承的是父框架的属性。注意参数传递的形式。
22. 框架中添加panel是为了方便管理panel中的控件。新建一个处理对话框的类,构造函数,可以继承对话框基本属性。也可以在对话框上添加panel,button等。他们都可以看做是一个容器。
23. wxpython图像动态显示,引入了定时器,绑定事件,间隔一定时间,响应该事件。
画图引入双缓冲机制,可以防止画图时闪烁。画图实质是,把以前的图像擦除,默认擦除为黑色,新绘一个点,显示在屏幕上的其实是一张张不断切换的图片,每个窗口在桌面上显示,实质是在每个规定区域重新画了一幅图。所以运行时会出现黑屏闪烁等问题。画笔引入buffer 可以实现一个画图动作结束了,再显示上去,避免了画图时光标闪烁。
24.python的.py文件执行时会生成一个.pyc的中间文件。
附:本人初学wxpython,学习教程为wxPython in Action,本文大多内容参考来源于此书籍。