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=None)
  2. Add(sizer, proportion=0, flag=0, border=0, userData=None)
  3. Add(size, proportion=0, flag=0, border=0, userData=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=None)
  2. Insert(index, sizer, proportion=0, flag=0, border=0, userData=None)
  3. Insert(index, size, proportion=0, flag=0, border=0, userData=None)

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

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

wxPython布局管理器(sizer)学习(1),布布扣,bubuko.com

时间: 2024-11-15 11:51:56

wxPython布局管理器(sizer)学习(1)的相关文章

JavaSE学习55:GUI编程之布局管理器

一布局管理器概述 Java语言中,提供了布局管理器类的对象可以管理. 管理Component对象在Container对象中的布局,不必直接设置Component对象位置和大小.每个Container对象 都有一个布局管理器对象,当容器需要对某个组件进行特定或判断其大小尺寸时,就会调用其对应的布局管理器,调 用Container对象的setLayout()方法改变其布局管理器对象. AWT提供了5种布局管理器,分别为: FlowLayout布局管理器 BorderLayout布局管理器 GridL

Qt学习四 - 布局管理器

开发界面程序,一定会涉及到布局的问题.我们需要让控件显示在理想中的位置,可以直接设置控件的坐标和宽高.但是这样带来一个问题,当用户改变窗口大小时,例如点击最大化按钮或者拖拽窗口边缘,控件是不会改变的(包括控件的坐标和宽高).因为在窗口改变时,你没有告诉程序是否更新控件以及如何更新.如果需要让控件自动更新,那么就要自己来写一些函数来相应这些变化.针对这种情况,Qt提供了一种机制 - 布局,来解决这个问题(大部分用于开发界面程序的语言或者框架,都会提供类似的机制).只需要将控件放入某一种布局,当位置

JAVA学习笔记(四十五) - 布局管理器

FlowLayout流式布局管理器 /* * FlowLayout流式布局管理器 */ public class Test03 { public static void main(String[] args) { Frame frame=new Frame("My Frame"); Button btn1=new Button("按钮1"); Button btn2=new Button("按钮2"); Button btn3=new Butto

wxpython布局管理部件wx.gridbagsizer用法示例

text = ("This is text box")         panel = wx.Panel(self, -1)         chkAll1 = wx.CheckBox(panel, ID_CHKBOX_CAN_SEL_ALL, u'全选')                chkKnown = wx.CheckBox(panel, ID_CHKBOX_CAN_UNKNOWN, u'不会')         chkUnknow = wx.CheckBox(panel, I

Java之GUI编程(二)——布局管理器

在上篇博客Java之GUI编程(一)中我已经对GUI编程的组件和事件做了简单介绍了,现在来看看另外一部分关于组件在各个平台是如何做到仍能保持自己合理的位置大小以及外观的. 已经说了Java是跨平台运行的,但是不同的平台对于点及坐标的定义不完全相同.而且屏幕的解析度分辨率不同也会造成位置的变化,为了确保每个组件的相对位置和大小以及外观,java就设计了布局管理器. 布局管理器是对容器中的元素进行管理,按照一定的规则排放容器里面的元素.它控制了组件的摆放. 布局管理器分类: FlowLayout:浮

(转)Java 的swing.GroupLayout布局管理器的使用方法和实例

摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器的使用方法和实例 GroupLayout 是一个 LayoutManager,它将组件按层次分组,以决定它们在 Container 中的位置.GroupLayout 主要供生成器使用,但也可以手工编码.分组由 Group 类的实例来完成.GroupLayout 支持两种组.串行组 (sequenti

Qt布局管理器的使用(一)

曾经对Qt的布局管理器掌握的还不清楚,今天特意学习了下.感觉收获还挺大的,特意拿出来和大家分享. 首先.要明确布局管理器的用处,及使我们的界面看起来比較整洁.美化.另外一点就是为了使我们的控件可以更随窗体的大小而变化,窗体大的时候它变大,窗体小的时候它变小. 一般写 好的软件都要能最大化.最小化,非常多时候当我们最大化后,发现控件还是原来的样子.非常难看,如今就不用发愁了,首先用手动布局实现.由于这个比較简单,并且非常直观. 首先贴一张我自己刚布好的局. 还算整洁.这张是它最初的大小,将它最大化

JAVA学习Swing章节流布局管理器简单学习

package com.swing; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.WindowConstants; /** * 1:流(FlowLayout)布局管理器是布局管理器中最基本的布局管理器,流布局管理器在整个容器中 * 的布局正如其名,像流一样从左到右摆放组件,直到占据了这

QT之布局管理器(十九)

我们在之前的 GUI 开发中都是使用的是绝对定位,何谓绝对定位呢?就是我们直接在像素级指定各个组件的位置和大小.比如我们之前使用的 void QWidget::move(int x, int y):void QWidget::resize(int w, int h):这样存在的问题就是组件的位置和大小无法自适应父窗口的变化. 我们先来看看绝对定位的代码和效果是怎样的?头文件代码如下: #include <QWidget> #include <QPushButton> class W