【转载博主麦兜搞IT
:http://blog.sina.com.cn/s/blog_4b5039210100ez54.html】
因为笔记主要是摘自《wxpython in action》,很多名词我怕翻译不准,就直接用英文原文来代替,就像今天的top-level window object 和subwindow object ,这里暂时叫顶层窗口对象和子窗口对象。
首先看一下wxpython的输出重定向,关于什么是标准输入输出和其对应的重定向,可以参看http://blog.sina.com.cn/s/blog_4b5039210100dtam.html或者到网上查找相关内容。下面以一个例子来说明。(这里虽然是讲重定向,但是我们的用意是看看一个标准的wxpython程序时怎么运行的,它的运行顺序是什么)
import wx
import sys
class Frame(wx.Frame):
def __init__(self,parent,id,title):
print "Frame__init__"
wx.Frame.__init__(self,parent,id,title)
class App(wx.App):
def __init__(self,redirect=True,filename=None):
print "App__init__"
wx.App.__init__(self,redirect,filename)
def OnInit(self):
print "OnInit"
self.frame=Frame(parent=None,id=-1,title='Startup')
self.frame.Show()
self.SetTopWindow(self.frame)
print >>sys.stderr,"A pretend error message"
return True
def OnExit(self):
print "OnExit"
if __name__=='__main__':
app=App(redirect=True)
print "before MainLoop"
app.MainLoop()
print "after MainLoop"
运行结果,出现两个窗口,一个是wxpython的frame,另一个就是我们把标准输出重定向到了一个wxpython窗口
并且在命令行会出现下面的结果:
其中第一个是在frame产生前打印的,第二行是在我们关闭frame窗口后打印的。
从这个程序,我们基本能看出整个程序的运行顺序和步骤。
首先程序要运行的是建立应用类的实例app=App(redirect=True),然后就要进行这个子类的实现,而App是继承于wx..App,然后就自然要用到父类的__init__()方法,所以App__init__首先被打印出来,因为此时frame还没有产生,所以App__init__被打印在了命令行。然后进入OnInit方法,此时frame产生,然后就是Frame方法,然后进入MainLoop循环,结束以后,最后打印after MainLoop。
Top-level window object
顶层窗口对象,就是不被任何其他组件包含的对象,相反,顶层窗口对象可以包含其他的组件,是我们程序的主窗口。一个应用必须至少一个top-level window object,它通常是wx.Frame的一个子类,也可以使wx.Dialog 的子类。
通常我们用SetTopWindow()来设置某个frame或别的为top-level window object ,如果我们不设置,那么系统默认第一个frame为top-level window object
Wx.Frame是所有frame对象的父类,下面简单看一下这个类。如何创建一个frame对象,前面已经说过,可以直接用wx.Frame()实现,或者先定义一个它的子类,再由子类来定义frame。
wx.Frame(parent,id=-1,title='',pos=wx.DefaultPostion,size=wx.DefaultSize,
style=wx.DEFAULT_FRAME_STYLE,name='frame')
下面看看这几个参数:
Parent:当前窗口的父窗口,如果当前窗口时top-level window的话,则parent=None,如果不是顶层窗口,则它的值为所属frame的名字
Id:一个新窗口的id,一般我们都设为-1,这样wxpython会自动产生一个id。
Title:窗口的标题,在标题栏上显示的内容
Pos:它的值是一个wx.Point的对象,是一个元组,表示了窗口创建时的位置坐标
Size:它的值是一个wx.Size的对象,也是一个元组,表示了窗口的大小。
Style:窗口的风格,窗口有多种风格,我们可以用(|)来组合想要的风格,下面就详细看一下。(熟悉MFC的朋友应该觉得很眼熟)
1. wx.CAPTION 增加一个title bar to the frame,用来显示title这个属性
2. wx.CLOSE_BOX 增加一个关闭窗口的按钮
3. wx.DEFAULT_FRAME_STYLE 这是个默认窗口风格,也是我们经常使用的,它其实是这样定义的:wx.MAXIMIZE_BOX| wx.MINIMIZE_BOX| wx.RESIZE_BORDER|wx.SYSTEM_MENU| wx.CAPTION| wx.CLOSE_BOX
4. wx.FRAME_SHAPED
5. wx.FRAME_TOOL_WINDOW
6. wx.MAXIMIZE_BOX
7. wx.MINIMIZE_BOX
8. wx.RESIZE_BORDER
9. wx.SIMPLE_BORDER
10. wx_SYSTEM_MENU
下面是几个实例:
默认的
无最大化最小化按钮,边界不能拖动
可以多尝试集中风格试试。