前面几篇的学习笔记中,对 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 三个组件
代码如下:
代码
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()
//==========================================