前面几篇的学习笔记中,对 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 三个组件
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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()