首页 > 代码库 > wxPython布局管理器(sizer)学习(1)

wxPython布局管理器(sizer)学习(1)

个人认为学习GUI程序开发,最重要的两个基础点就是:事件处理和界面布局。事件处理能够让你在界面上的控件被鼠标、按键等触发的时候做出合适的响应,比如点击“保存”按钮之后弹出标准的文件保存对话框。另外一件重要的就是界面的布局,之所以要有GUI程序,就是为了有良好的用户体验,如果一个软件界面布局乱七八糟的话,肯定是不合适的。至于按钮、文本框、静态文本这些组件,不过是通过相应的类产生实例并用Add之类的方法添加到面板上而已。

wxPython的sizer是用于自动布局一组窗口(之前提到过GUI程序开发中窗口的概念,一个按钮、一个文本框都叫窗口(window),而软件的主体结构,通常为矩形,我们称之为框架(Frame))的算法。使用sizer的好处是当容器(一个Frame或Panel)的尺寸被用户调整时,容器内的组件会自动重新计算最优化的大小和位置,不用像绝对定位那样为每一个组件设计大小和位置。sizer的缺陷也很明显,那就是有一定的局限性,因为sizer的类型是有限的,在布局上不能像绝对定位那样随心所欲。需要注意的是,sizer本身并不是容器,只是一种算法,把组件添加到某个sizer,实际上是说这个组件用这个sizer来计算它该如何布局,而实际上组件的容器还是一个Frame或者Panel。

wxPython中预定义的sizer

  • Grid: 最基础的二维网格布局,可以指定行列,每个网格的尺寸都相同。
  • Flex grid:在Grid的基础上进行了改进,网格的尺寸可以不同。
  • Grid bag:最灵活的网格布局器,可以随意放置在网格中放置组件。
  • Box:在一条水平线或垂直线上进行布局,网格的尺寸可以不同,通常用于嵌套。
  • Static box:标准的box sizer,一圈环线上可以带有文本标题。

 使用sizer的基本步骤

  1. 创建sizer并使用SetSizer(sizer)方法将它关联到容器。例如:panel.SetSizer(mySizer)。
  2. 使用Add()方法将有关组件添加至sizer。如:mySizer.Add(saveBtn)。
  3. (可选)用Fit()方法使sizer能够计算它的尺寸。如:mySizer.Fit(panel),这个方法会使sizer根据容器内的组件计算它自己应该有多大才能容纳下这些组件,并且把这部分组件的父窗口(容器)调整为合适的大小。还有个FitInside()方法,它不调整父窗口大小。

Grid sizer

下图所示,是一个最基本的Grid sizer,每个组件的尺寸相同,整齐排列在二维网格中。

Grid sizer的构造函数:

wx.GridSizer(rows, cols, vgap, hgap)

这个函数中,rows和cols指定行列数量,vgap和hgap分别指定控件之间的垂直和水平间隔。这四个属性都有各自的set*和get*方法来设置或获取值。GetRows(), SetRows(rows), GetCols(), SetCols(cols)......

Grid sizer的每个网格尺寸都是相同的,其大小是根据所放置的最大控件来计算。

为sizer添加控件

首先要明白,添加控件到sizer中的次序是非常重要的。在Grid sizer中,你所添加的控件会从左至右,从上到下地添加到网格中。

添加控件到网格的最常用方法是Add()方法,它有如下三种重载形式:

  1. Add(window, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)
  2. Add(sizer, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)
  3. Add(size, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)

第一种形式最常用,将窗口控件添加到sizer。第二种形式是把一个子sizer添加到父sizer,用于嵌套布局。第三个是添加一个size大小的空白到sizer,通常用于在控件之间添加空白符。

proportion参数只在box sizer中才有效。flag标记用于控制对齐方式等。如果flag参数指定了边框,就需要用border参数指定边框宽度。userData用于传递额外数据,往往自定义sizer时需要使用。

 除了Add()方法之外,还有Insert()方法,它可以通过index参数将控件、sizer或size添加到sizer的任意位置,有如下三种形式:

  1. Insert(index, window, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)
  2. Insert(index, sizer, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)
  3. Insert(index, size, proportion=0, flag=0, border=0, userData=http://www.mamicode.com/None)

 Prepend()方法,用于将控件、sizer、size添加到sizer的第一个位置,参数与Add方法一样。

 从sizer中移除控件,可以使用Detach()方法,参数可以是window、sizer、index。