在wxPython的类层次结构中,由wx.Sizer类及其派生类所代表的布局管理器,已成为在wxPython中定义对话框中控件布局的首选方法。这是因为它们能够创建出视觉效果良好的对话框,且不受平台的限制,同时还考虑到了各个控件在大小和样式上的差异。诸如wxDesigner、DialogBlocks、XRCed和wxWorkshop这样的编辑器完全基于布局管理器来创建对话框,实际上促使了用户创建出不打折扣的、与平台无关的布局。
下一部分将描述并展示使用布局管理器能够实现哪些功能。接下来的几个部分将简要介绍如何使用各个布局管理器类进行编程。
布局管理器背后的理念
wxPython中布局管理器所使用的布局算法,与其他GUI工具包中的布局系统密切相关,比如Java的抽象窗口工具包(AWT)、GTK工具包或Qt工具包。它基于这样一种理念:各个子窗口会报告自身所需的最小尺寸,并且当父窗口大小发生变化时,子窗口能够进行拉伸。这通常意味着程序员无需设置对话框的初始启动大小,而是会为对话框分配一个布局管理器,然后查询该布局管理器以获取推荐的大小。反过来,这个布局管理器会查询它的子项(可以是普通窗口、空白区域或其他布局管理器),这样就能构建出一个布局管理器层次结构。请注意,wx.Sizer并非派生自wx.Window,因此它不会干扰选项卡顺序,并且与屏幕上的真实窗口相比,它所需的资源极少。
布局管理器之所以非常适合在wxPython中使用,原因在于每个控件都会报告自身的最小尺寸,而且该算法能够毫无问题地处理不同平台上字体大小的差异或不同窗口(对话框项)尺寸的差异。例如,如果Linux/GTK控件的标准字体以及整体设计相比Windows需要更多的空间,那么在Linux/GTK系统上,对话框的初始尺寸会自动比在Windows系统上更大。
目前在wxPython中有五种不同类型的布局管理器可供使用。每一种布局管理器要么代表了在对话框中排列对话框项的某种特定方式,要么是用于完成一项特殊任务,比如在一个对话框项(或另一个布局管理器)周围添加一个静态框。接下来本文将逐一讨论这些布局管理器。想要了解有关如何通过编程方式使用布局管理器的更详细信息,请参阅“使用BoxSizer进行编程”这一部分内容。
常见特征
所有的布局管理器都是容器,也就是说,它们被用来对其所包含的一个对话框项(或多个对话框项)进行布局。这些项有时被称为布局管理器的子项。不管各个布局管理器如何排列它们的子项,所有子项都有某些共同的特征:
最小尺寸:这个最小尺寸通常与控件的初始尺寸相同,可以在控件构造函数的wx.Size字段中显式设置,也可以由wxPython计算得出,通常的做法是将项的高度和/或宽度设置为-1。请注意,只有一些控件能够计算自身的尺寸(比如复选框),而其他控件(比如列表框)没有任何自然的宽度或高度,因此需要显式设置尺寸。有些控件可以计算自身的高度,但无法计算宽度(例如单行文本控件):
边框:边框仅仅是空白区域,用于在对话框中分隔各个对话框项。这个边框可以环绕在四周,也可以设置在任意组合的边上,比如仅在控件的上方和下方。边框的厚度必须显式设置,通常为5个单位。以下示例展示了仅包含一个对话框项(一个按钮)的对话框,以及按钮周围边框分别为0像素、5像素和10像素时的情况:
对齐方式:通常情况下,分配给对话框项的空间会大于其最小尺寸加上边框的大小。根据为相应对话框项所使用的标志,该对话框项可以被设置为完全填满可用空间,也就是说,它会扩展到大于最小尺寸的大小,或者它会被移动到可用空间的中心位置,又或者是移动到空间的某一侧。下面的示例展示了一个水平盒子布局管理器中包含的一个列表框和三个按钮;其中一个按钮居中对齐,一个按钮顶端对齐,一个按钮底端对齐:
伸展因子:如果一个布局管理器包含多个子项,并且所提供的空间大于其子项及其边框所需的空间,那么就会产生一个问题,即如何在这些子项之间分配剩余空间。为此,可以为每个子项分配一个伸展因子,其中默认值0表示该子项不会获得比其请求的最小尺寸更多的空间。大于零的值是根据相应布局管理器中子项的所有伸展因子之和来进行解释的,也就是说,如果两个子项的伸展因子都为1,那么它们将各自获得额外空间的一半,而不管其中一个控件的最小尺寸是否小于另一个控件的最小尺寸。下面的示例展示了一个包含三个按钮的对话框,第一个按钮的伸展因子为1,因此会被拉伸,而另外两个按钮的伸展因子为0,并保持其初始宽度:
在wxDesigner中,这个伸展因子是通过选项菜单来设置的。
wx.Sizers - 视觉方法
添加窗口的基本方法
让我们来看看wx.BoxSizer.。这是最基本类型的盒子布局管理器,我们向其中添加窗口小部件的方式可以通过查看wx.BoxSizer.Add的函数签名来了解:
Add(window, proportion=0, flag=0, border=0, userData=None)将一个子项附加到布局管理器中。
参数:
- window——是一个要添加到布局管理器中的窗口、空白间隔区域或另一个布局管理器。它的初始大小(要么由用户显式设置,要么由内部计算得出)被视为最小尺寸,并且在很多情况下也是其初始尺寸。
- proportion (int) ——这个参数在 wx.BoxSizer中用于指示布局管理器的子项是否可以在wx.BoxSizer的主方向上改变其大小,其中0表示不可改变,而大于零的值则相对于同一个wx.BoxSizer的其他子项的值来进行解释。例如,你可能有一个水平的 wx.BoxSizer,它有三个子项,其中两个子项应该随着该布局管理器改变大小。那么这两个可伸展的窗口每个都将被赋予值1,以使它们随着该布局管理器的水平尺寸同等地放大和缩小。
- flag (int)——影响布局管理器行为的标志的按位或组合。
- border (int) ——如果标志参数被设置为包含任何边框标志,则该参数用于确定边框宽度。
- userData (object) ——允许将一个额外的对象附加到布局管理器项上,当尺寸调整信息比比例和标志所能处理的情况更复杂时,供派生类使用。
返回类型:
让我们创建一个垂直布局管理器(子项将一个叠在另一个上方放置),并在其中放置两个按钮。所有的“额外”参数都设置为 0;我们稍后再来考虑这些参数。
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(wx.Button(self, -1, 'An extremely long button text'), 0, 0, 0)
sizer.Add(wx.Button(self, -1, 'Small button'), 0, 0, 0)
self.SetSizer(sizer)
你会注意到几件事:
- 按钮的大小刚好足以容纳其中的文本。实际上,以这种方式放置在布局管理器中的任何控件都会以其最小尺寸显示,除非我们更改相关参数。
- 窗口的大小并没有调整以适配布局管理器。这就导致出现了许多难看的空白区域。
我们先来处理第二个问题。为了让窗口大小更合适,我们可以设置尺寸提示,以告知包含该布局管理器的窗口根据布局管理器的大小进行调整:
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(wx.Button(self, -1, 'An extremely long button text'), 0, 0, 0)
sizer.Add(wx.Button(self, -1, 'Small button'), 0, 0, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
以上修改在像这样的情况下特别有用,否则在这种情况下,wx.Frame的默认大小可能会过大或过小,以至于无法以美观的方式显示大多数布局。
proportion参数
wx.BoxSizer.Add的第一个参数显然是你要添加的wx.Window或wx.Sizer。第二个参数(即比例)定义了布局管理器中子项相对于彼此的大小。在垂直布局管理器中,这会改变子项的高度;在水平布局管理器中,这会改变子项的宽度。以下是一些示例:
sizer = wx.BoxSizer(wx.VERTICAL)
# 第二个按钮的高度是第一个按钮的三倍
sizer.Add(wx.Button(self, -1, 'An extremely long button text'), 1, 0, 0)
sizer.Add(wx.Button(self, -1, 'Small button'), 3, 0, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
代码与上述相同,只是窗口已调整了大小。请注意,底部的按钮高度仍然是顶部按钮的三倍。
sizer = wx.BoxSizer(wx.VERTICAL)
# 第一个按钮的高度是第二个按钮的二分之三倍
sizer.Add(wx.Button(self, -1, 'An extremely long button text'), 3, 0, 0)
sizer.Add(wx.Button(self, -1, 'Small button'), 2, 0, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
如果其中一个比例参数为0,那么对应的wx.Window将保持最小尺寸,而其他的窗口将按比例进行尺寸调整:
sizer = wx.BoxSizer(wx.VERTICAL)
# 第三个按钮的大小是第二个按钮的两倍
sizer.Add(wx.Button(self, -1, 'An extremely long button text'), 0, 0, 0)
sizer.Add(wx.Button(self, -1, 'Small button'), 1, 0, 0)
sizer.Add(wx.Button(self, -1, 'Another button'), 2, 0, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
代码与上述相同,且窗口已调整了大小。顶部的按钮(比例为0)仍然保持最小高度,并且第三个按钮的高度仍然是第二个按钮的两倍。
例如,当你想要在底部放置一个大小仅为所需尺寸的按钮,而让其他一些控件占据框架的剩余空间时,这一点尤其有用。要实现这一点,可将按钮的比例设为0,而将其他控件的比例设为大于0的数值。特别是苹果电脑(Mac)的用户会很感激你没有创建巨大的Aqua风格按钮。
flags和border参数
wx.Sizer.Add所接受的flag参数是以下标志的按位OR组合。使用这些标志定义了两种主要行为。其一为窗口周围的边框:border参数决定边框的宽度,而此处给出的标志则决定将边框添加到布局管理器项的哪一侧(或哪些侧)。其他标志决定了当分配给布局管理器的空间发生变化时,该布局管理器项的表现方式,并且在一定程度上取决于所使用的特定类型的布局管理器。
| 布局管理器的Flag | 描述 |
|---|---|
wx.TOP``wx.BOTTOM``wx.LEFT``wx.RIGHT``wx.ALL | 这些标志用于指定边框宽度将应用于布局管理器项的哪一侧(或哪些侧)。 |
wx.EXPAND | 该项将被扩展以填满分配给它的空间。 |
wx.SHAPED | 该项将在尽可能扩展的同时,保持其宽高比。 |
wx.FIXED_MINSIZE | 通常情况下,wx.Sizers会使用 wx.Window.GetEffectiveMinSize来确定窗口项的最小尺寸应该是多少,并会使用该尺寸来计算布局。这使得当某个项发生变化且其最佳尺寸改变时,布局能够进行相应调整。如果你希望窗口项保持其初始尺寸,那么可以使用wx.FIXED_MINSIZE。 |
wx.RESERVE_SPACE_EVEN_IF_HIDDEN | 通常情况下,wx.Sizers不会为隐藏的窗口或其他项分配空间。这个标志会覆盖这种默认行为,以便即使窗口不可见,也会为其分配足够的空间。例如,这使得在不调整父对话框大小的情况下动态显示和隐藏控件成为可能。 |
wx.ALIGN_CENTER 或 wx.ALIGN_CENTRE``wx.ALIGN_LEFT``wx.ALIGN_RIGHT``wx.ALIGN_RIGHT``wx.ALIGN_TOP``wx.ALIGN_BOTTOM``wx.ALIGN_CENTER_VERTICAL 或 wx.ALIGN_CENTRE_VERTICAL``wx.ALIGN_CENTER_HORIZONTAL 或 wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN*标志可让你指定该项在布局管理器分配给它的空间内的对齐方式,并且如果存在边框的话,还会针对边框进行相应调整。 |
让我们从最简单的情况开始:对齐标志。这些标志的含义相当一目了然。
sizer = wx.BoxSizer(wx.VERTICAL)
# 第二个按钮是右对齐的
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.ALIGN_RIGHT, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
sizer = wx.BoxSizer(wx.VERTICAL)
# 第二个按钮是居中对齐的
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.ALIGN_CENTER, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
接下来是wx.EXPAND标志。它与wx.GROW同义。
sizer = wx.BoxSizer(wx.VERTICAL)
# 第二个按钮会扩展至占满整个父容器的宽度
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.EXPAND, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
你可以看到,第一个按钮采用了其最小尺寸,而第二个按钮进行了扩展以与之匹配。这对控件的影响方式与第二个参数的作用相反;在垂直布局管理器中,wx.EXPAND会导致控件在水平方向上扩展,而在水平布局管理器中,它会导致控件在垂直方向上扩展。
接下来是wx.SHAPED。这个标志可确保对象的宽度和高度相互保持成比例。对于按钮来说,这个标志意义不大,但对于位图而言却非常有用,因为如果不按比例缩放,位图可能会变形或被裁剪。
sizer = wx.BoxSizer(wx.VERTICAL)
# 第二个按钮将按比例进行缩放
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 1, wx.SHAPED, 0)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
代码与上述相同,只是调整了窗口大小。宽度随着高度大幅增加。实际上,它并没有在垂直方向上完全按比例增长,因为在增长过程中无法保持正确的比例。
最后,我们来说说边框标志。这些标志只有在边框参数大于0时才有意义,它们描述了控件上应该显示边框的边。为了最清楚地展示这一点,我们将保留wx.EXPAND标志。
sizer = wx.BoxSizer(wx.VERTICAL)
# 边框大小的影响
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.EXPAND | wx.LEFT, 20)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
sizer = wx.BoxSizer(wx.VERTICAL)
# 边框大小的影响
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 20)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
sizer = wx.BoxSizer(wx.VERTICAL)
# 边框大小的影响
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 20)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
sizer = wx.BoxSizer(wx.VERTICAL)
# 边框大小的影响
sizer.Add(wx.Button(self, -1, "An extremely long button text"), 0, 0, 0)
sizer.Add(wx.Button(self, -1, "Small Button"), 0, wx.EXPAND | wx.ALL, 20)
sizer.SetSizeHints(self)
self.SetSizer(sizer)
你可以看到,按钮从布局管理器指定的边缘偏移了我们在border参数中所指定的像素数。
使用布局管理器隐藏控件
你可以像隐藏任何控件一样,使用wx.Window.Show方法来隐藏包含在布局管理器中的控件。然而,wx.Sizer还提供了一个单独的方法,该方法可以告知布局管理器在其尺寸计算中不考虑该控件。要使用布局管理器隐藏一个窗口,需调用wx.Sizer.Show方法。然后你必须调用布局管理器上的Layout方法来强制进行更新。
在隐藏界面的某些部分时,这一点很有用,因为你可以避免将控件从布局管理器中移除,然后又不得不在之后再将它们添加回去。
注意:仅wx.BoxSizer和wx.FlexGridSizer支持。
BoxSizer
wx.BoxSizer可以根据在其构造函数中所使用的标志,将其子项垂直或水平地进行布局。当使用垂直布局管理器时,每个子项可以居中对齐、右对齐或左对齐。相应地,当使用水平布局管理器时,每个子项可以居中对齐、底部对齐或顶部对齐。上一段中描述的拉伸因子用于主要方向,也就是说,当使用水平框式布局管理器时,拉伸因子决定了子项在水平方向上可以拉伸的程度。下面的示例展示了与上一个示例相同的对话框,只是现在的框式布局管理器是一个垂直框式布局管理器:
StaticBoxSizer
wx.StaticBoxSizer与wx.BoxSizer相同,只不过它被一个静态框包围着。以下是一个示例:
GridSizer
wx.GridSizer是一种二维布局管理器。所有子项都会被赋予相同的大小,这个大小是最大子项所需的最小尺寸,在这种情况下,指的是左下角边框处的文本控件的最小尺寸。列数或者行数是固定的,并且如果添加了新的子项,网格布局管理器会在相应的另一个方向上进行扩展。
有关编程方面的信息,请参阅wx.GridSizer。
FlexGridSizer
另一种从wx.GridSizer派生而来的二维布局管理器。每列的宽度和每行的高度会根据各自最大子项的最小需求分别进行计算。此外,如果为该布局管理器指定的尺寸与它所请求的尺寸不同,那么可以声明列和行是可拉伸的。下面的示例展示了与上述相同的对话框,但使用的是一个灵活网格布局管理器:
使用BoxSizer编程
wx.BoxSizer背后的基本理念是,窗口的布局大多会采用相当简单的基本几何形式,通常是排成一行、一列,或者是由行和列构成的若干层次结构。
作为一个示例,我们将构建一个对话框,该对话框顶部有一个文本字段,底部有两个按钮。这可以看作是一个顶层的列布局,文本在顶部,按钮在底部;同时还有一个底层的行布局,其中“确定”按钮在左边,“取消”按钮在右边。在许多情况下(尤其是在Unix系统下的对话框和普通框架中),主窗口是用户可以调整大小的,并且这种大小的变化必须传递给它的子控件。在我们的例子中,我们希望文本区域能随着对话框一起变大,而按钮的大小应保持固定。此外,所有控件周围要有一圈细边框,以使对话框看起来美观——更麻烦的是,随着对话框宽度的变化,按钮应保持居中显示。
框式布局管理器的独特之处在于,它可以在两个方向(高度和宽度)上进行扩展,但在主方向(对于一行来说是水平方向)上,它可以不均匀地将扩展部分分配给各个子控件。在我们的示例中,垂直布局管理器应该将其所有的高度变化仅传递给文本区域,而不是按钮区域。这是在向布局管理器添加一个窗口(或另一个布局管理器)时由proportion参数决定的。该参数被解释为一个权重因子,也就是说,它可以为零,这表示该窗口根本不可以调整大小,也可以大于零。如果几个窗口的权重因子都大于零,那么这个值将相对于布局管理器中所有权重因子的总和来进行解释。所以,当添加两个权重值都为1的窗口时,它们都会以相同的程度进行大小调整,并且每个窗口调整的程度都是它们所属布局管理器调整程度的一半。 那么,当一个列布局管理器改变其宽度时会怎样呢?这种行为是由标志(Add() 函数的第二个参数)控制的:值为零或不使用标志表示该窗口将保持其原始大小,wx.GROW标志(与wx.EXPAND相同)会强制该窗口随着布局管理器一起扩展,而wx.SHAPED标志则告诉窗口按比例改变其大小,保持原始的纵横比。当不使用wx.GROW标志时,该项可以在可用空间内进行对齐。wx.ALIGN_LEFT、wx.ALIGN_TOP、wx.ALIGN_RIGHT、wx.ALIGN_BOTTOM、wx.ALIGN_CENTER_HORIZONTAL和wx.ALIGN_CENTER_VERTICAL正如其名称所表示的那样进行对齐操作。wx.ALIGN_CENTRE(与wx.ALIGN_CENTER相同)被定义为(wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)。默认的对齐方式是wx.ALIGN_LEFT | wx.ALIGN_TOP。
如上文所述,属于某个布局管理器的任何窗口都可以有边框,并且可以使用wx.TOP、wx.LEFT、wx.RIGHT和wx.BOTTOM这些常量来指定四条边中哪几条边可以有这个边框,或者使用wx.ALL来指定四条边都有边框(你也可以使用wx.NORTH、wx.WEST等常量来替代)。这些边框标志可以与上述的对齐标志结合使用,通过按位或运算符|作为Add() 方法的第二个参数。边框的大小也必须明确指定,它是Add() 方法的第三个参数。这意味着,一个布局管理器及其子控件的所有行为都可以通过Add() 方法的这三个参数来控制。
示例:
# 我们希望得到一个可拉伸的对话框,因为它顶部有一个文本控件,底部有两个按钮
class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog(parent, id, title, wx.DefaultPosition, wx.DefaultSize,
wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
topsizer = wx.BoxSizer(wx.VERTICAL)
# 创建最小尺寸为100×60的文本控件
topsizer.Add(
wx.TextCtrl(self, -1, "My text.", wx.DefaultPosition, wx.Size(100,60), wx.TE_MULTILINE),
1, # 使其在垂直方向上可拉伸
wx.EXPAND | # 使其在水平方向上可拉伸
wx.ALL, # 并且在四周都加上边框
10) # 将边框宽度设置为10
button_sizer = wx.BoxSizer(wx.HORIZONTAL)
button_sizer.Add(
wx.Button(self, wx.ID_OK, "OK"),
0, # 使其在水平方向上不可拉伸
wx.ALL, # 在四周都加上边框(默认顶部对齐)
10) # 将边框宽度设置为10
button_sizer.Add(
wx.Button(self, wx.ID_CANCEL, "Cancel"),
0, # 使其在水平方向上不可拉伸
wx.ALL, # 在四周都加上边框(默认顶部对齐)
10) # 将边框宽度设置为10
topsizer.Add(
button_sizer,
0, # 使其在垂直方向上不可拉伸
wx.ALIGN_CENTER) # 无边框并且水平居中
self.SetSizerAndFit(topsizer) # 使用布局管理器进行布局,并相应地调整窗口大小
#,同时防止窗口被调整为更小的尺寸。
请注意,向wx.Sizer指定标志的新方式是通过wx.SizerFlags。这个类极大地减轻了向wx.Sizer传递标志的负担。
以下是使用wx.SizerFlags来实现前面示例的方法:
# 我们想要得到一个可拉伸的对话框,因为它顶部有一个文本控件,底部有两个按钮
class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog(parent, id, title, wx.DefaultPosition, wx.DefaultSize,
wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
topsizer = wx.BoxSizer(wx.VERTICAL)
# 创建最小尺寸为100×60的文本控件
topsizer.Add(
wx.TextCtrl(self, -1, "My text.", wx.DefaultPosition, wx.Size(100,60), wx.TE_MULTILINE),
wx.SizerFlags(1).Align().Expand().Border(wx.ALL, 10))
button_sizer = wx.BoxSizer(wx.HORIZONTAL)
button_sizer.Add(
wx.Button(self, wx.ID_OK, "OK"),
wx.SizerFlags(0).Align().Border(wx.ALL, 10))
button_sizer.Add(
wx.Button(self, wx.ID_CANCEL, "Cancel"),
wx.SizerFlags(0).Align().Border(wx.ALL, 10))
topsizer.Add(
button_sizer,
wx.SizerFlags(0).Center())
self.SetSizerAndFit(topsizer) # 使用布局管理器进行布局,并设置尺寸和提示信息
其他类型的布局管理器
wx.GridSizer是一种布局管理器,它会将其子控件排列在一个二维表格中,且表格的所有单元格大小相同,也就是说,每个单元格的宽度是最宽子控件的宽度,每个单元格的高度是最高子控件的高度。
wx.FlexGridSizer是一种布局管理器,它将其子控件排列在一个二维表格中,使得同一行的所有表格单元格具有相同的高度,同一列的所有单元格具有相同的宽度,但不像wx.GridSizer那样,所有行的高度或所有列的宽度都一定相同。
wx.StaticBoxSizer是一个从wx.BoxSizer派生而来的布局管理器,不过它会在该布局管理器周围添加一个静态框。请注意,这个静态框必须单独创建。
wx.GridBagSizer是一种相当特殊的布局管理器,与其他类不同的是,它允许直接将元素放置在布局管理器中给定的位置上。更多详细信息,请查看其相关文档。
CreateButtonSizer
为了方便起见,wx.Dialog.CreateButtonSizer(flags)可用于创建一个标准的按钮布局管理器,在其中会显示标准按钮。以下标志可以传递给此方法:
| wx.YES_NO | 添加“是/否”子面板 |
|---|---|
| wx.YES | 返回wx.ID_YES |
| wx.NO | 返回wx.ID_NO |
| wx.NO_DEFAULT | 将wx.NO按钮设为默认按钮,否则wx.YES或wx.OK按钮将成为默认按钮 |
| wx.OK | 返回wx.ID_OK |
| wx.CANCEL | 返回wx.ID_CANCEL |
| wx.HELP | 返回wx.ID_HELP |
| wx.FORWARD | 返回wx.ID_FORWARD |
| wx.BACKWARD | 返回wx.ID_BACKWARD |
| wx.SETUP | 返回wx.ID_SETUP |
| wx.MORE | 返回wx.ID_MORE |