悄然无声的 Blog
不是我不明白,这世界变化快!

前面几篇的学习笔记中,对 wx.Frame 已经有了一个大概的了解,wx.Frame 就是一个窗体框架,他有标题栏、有客户绘制区、有菜单条、有工具条、有状态栏、可以最大最小化、可以改变尺寸等等。

 

但是,这个 wx.Frame 窗体和 VB 、Delphi 、WinForm 等等的窗体有一点不一样的地方:一般情况下我们并不直接在窗体上放置控件。

 

如果你直接将控件放置在 wx.Frame 上,则控件的大小和位置设置都将不起作用,控件将充满整个 Frame 的客户区域,如果你放置两个按钮,则这两个按钮将共同填充整个客户区域。

 

所以,一般情况下,我们会先放置一个 wx.Panel 面板在 Frame 上面,同样的,Panel 将会充满整个框架,然后我们再将按钮、文本框等控件放置在 Panel 上,这样就可以设置位置和大小了。

 

当然,如果我们要为每一个控件设置位置和大小是一件很繁琐的事情,所以 wxPython 还提供了另外一种方法,就是现在 Frame 放置布局管理器,布局管理器可以构造出很复杂的界面。

 

那么我们如何将放置到窗体上呢?wxPython 所有窗口对象构造函数的第一个参数总是一个指向父窗口的引用。前面我们说过,Frame 如果是顶层窗口,则第一个可以传入一个 None,代表没有父窗口。

如果要在 Frame 上面放置一个 Panel ,则 Panel 的第一个参数传入 Frame ,说明 Frame 是 Panel 的父窗口,那么 Panel 就会出现在 Frame 上面了。

同样,如果要在 Panel 上面放置一个 Button ,则 Button 的第一个参数传入 Panel ,那么 Button 就会出现在 Panel 上面了。

 

下面看看 Panel 的构造函数:

__init__(selfparentid=-1pos=DefaultPositionsize=DefaultSizestyle=wxTAB_TRAVERSAL|wxNO_BORDERname=PanelNameStr)

我们看到,除了第一个参数 parent ,其他参数都有默认值,就像上面说过的,如果放置在 Frame 上面,大小和尺寸我们设定了也没用。

 

下面再看看 Button 的构造函数: 

 

__init__(selfparentid=-1label=EmptyStringpos=DefaultPositionsize=DefaultSizestyle=0validator=DefaultValidator,name=ButtonNameStr) 

 

同 Panel 一样,除了第一个参数 parent ,其他参数都有默认值。

 

下面的代码在 Frame 上加入了 Panel  Button 和 StaticText 三个组件

代码如下:

代码
 1 #!/usr/bin/python
 2 # -*- coding: GBK -*-
 3 
 4 import wx
 5 
 6 """
 7 在窗体中添加其他部件
 8 """
 9 
10 class MyFrame(wx.Frame):
11     
12     def __init__(self):
13         wx.Frame.__init__(self,parent=None,id=wx.ID_ANY,title="Hello wxPython",size=(200,160))
14         #添加一个面板
15         #第一个参数 self ,代表父窗体为 MyFrame 的一个对象实例
16         panel=wx.Panel(self)
17         
18         #添加一个按钮
19         #第一个参数 panel ,代表父窗体为 panel ,按钮将出现在 panel 之上
20         wx.Button(panel,wx.ID_ANY,"Button",pos=(10,10),size=(80,40))
21         
22         #添加一个文本标签
23         #第一个参数 panel ,代表父窗体为 panel ,文本标签将出现在 panel 之上
24         wx.StaticText(panel,-1,"This is the first line.\nThis is the second line.",pos=(10,80),size=(160,50))
25         #居中
26         self.Center()
27         #显示
28         self.Show()
29 
30 if __name__=='__main__':
31     #初始化程序
32     app=wx.App()
33     #创建窗体
34     MyFrame()    
35     #开始消息循环
36     app.MainLoop()

 

 


//==========================================
posted on 2010-12-25 21:49  左洸  阅读(1207)  评论(0编辑  收藏  举报