前面几篇的学习笔记中,对 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__(self, parent, id=-1, pos=DefaultPosition, size=DefaultSize, style=wxTAB_TRAVERSAL|wxNO_BORDER, name=PanelNameStr)
我们看到,除了第一个参数 parent ,其他参数都有默认值,就像上面说过的,如果放置在 Frame 上面,大小和尺寸我们设定了也没用。
下面再看看 Button 的构造函数:
__init__(self, parent, id=-1, label=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, validator=DefaultValidator,name=ButtonNameStr)
同 Panel 一样,除了第一个参数 parent ,其他参数都有默认值。
下面的代码在 Frame 上加入了 Panel Button 和 StaticText 三个组件
代码如下:
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()