wxPython布局管理器:从基础到实战应用
立即解锁
发布时间: 2025-08-17 02:04:03 阅读量: 4 订阅数: 15 


wxPython in Action:GUI开发的利器
### wxPython 布局管理器:从基础到实战应用
#### 1. 网格袋布局对象位置与跨度的获取和设置
在布局管理中,有时需要获取或设置已经在网格袋中的对象的位置或跨度。可以使用 `GetItemPosition()` 和 `GetItemSpan()` 方法来获取对象的位置或跨度。这两个方法的参数可以是窗口、布局管理器或索引。索引参数对应于布局管理器 `Add()` 列表中的索引,但在网格袋布局中,这个索引可能没有实际意义。
同时,有对应的设置方法 `SetItemPosition(window, pos)` 和 `SetItemSpan(window, span)`。其中,第一个参数同样可以是窗口、布局管理器或索引,第二个参数可以是 Python 元组、`wx.GBPosition` 或 `wx.GBSpan` 对象。
#### 2. 盒式布局管理器(Box Sizer)
盒式布局管理器是 wxPython 提供的最简单且最灵活的布局管理器。它可以是单个垂直列或水平行,其中的小部件会从左到右或从上到下依次排列。
虽然听起来简单,但盒式布局管理器的强大之处在于可以相互嵌套,这样就能轻松地在每行或每列中放置不同数量的项目。对于大多数应用程序来说,一个垂直布局管理器嵌套多个水平布局管理器通常就可以满足布局需求。
以下是几种不同盒式布局的示例代码:
```python
import wx
from blockwindow import BlockWindow
labels = "one two three four".split()
class TestFrame(wx.Frame):
title = "none"
def __init__(self):
wx.Frame.__init__(self, None, -1, self.title)
sizer = self.CreateSizerAndWindows()
self.SetSizer(sizer)
self.Fit()
class VBoxSizerFrame(TestFrame):
title = "Vertical BoxSizer"
def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)
return sizer
class HBoxSizerFrame(TestFrame):
title = "Horizontal BoxSizer"
def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.HORIZONTAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(75,30))
sizer.Add(bw, flag=wx.EXPAND)
return sizer
class VBoxSizerStretchableFrame(TestFrame):
title = "Stretchable BoxSizer"
def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)
# Add an item that takes all the free space
bw = BlockWindow(self, label="gets all free space", size=(200,30))
sizer.Add(bw, 1, flag=wx.EXPAND)
return sizer
class VBoxSizerMultiProportionalFrame(TestFrame):
title = "Proportional BoxSizer"
def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)
# Add an item that takes one share of the free space
bw = BlockWindow(self,
label="gets 1/3 of the free space",
size=(200,30))
sizer.Add(bw, 1, flag=wx.EXPAND)
# Add an item that takes 2 shares of the free space
bw = BlockWindow(self,
label="gets 2/3 of the free space",
size=(200,30))
sizer.Add(bw, 2, flag=wx.EXPAND)
return sizer
app = wx.PySimpleApp()
frameList = [VBoxSizerFrame, HBoxSizerFrame,
VBoxSizerStretchableFrame,
VBoxSizerMultiProportionalFrame]
for klass in frameList:
frame = klass()
frame.Show()
app.MainLoop()
```
盒式布局管理器是 `wx.BoxSizer` 类的实例,它是 `wx.Sizer` 的直接子类,几乎没有新增方法。`wx.BoxSizer` 的构造函数接受一个参数:
```python
wx.BoxSizer(orient)
```
其中,`orient` 参数表示布局管理器的方向,可以是 `wx.VERTICAL` 或 `wx.HORIZONTAL`。盒式布局管理器唯一的新方法是 `GetOrientation()`,它返回构造函数中设置的整数常量值。一旦创建了盒式布局管理器,就不能更改其方向。
盒式布局管理器的布局算法会区别对待其主方向(由构造时的方向定义)和次方向。具体来说,`proportion` 参数仅在布局管理器沿主方向增长或缩小时起作用,而 `wx.EXPAND` 标志仅在布局管理器在次方向上改变大小时起作用。
以下是盒式布局管理器与弹性网格布局管理器在比例项增长方面的区别:
| 布局管理器类型 | 比例项增长特点 |
| ---- | ---- |
| 盒式布局管理器 | 1. 比例行为在小部件添加到布局管理器时通过 `proportion` 参数确定,无需像弹性网格布局管理器那样单独指定可增长性。<br>2. 比例为 0 时,小部件在主维度上不会从其最小或最佳大小调整,但如果使用 `wx.EXPAND` 标志,仍可在次维度上增长。 |
| 弹性网格布局管理器 | 需要单独指定可增长性。 |
#### 3. 静态盒式布局管理器(Static Box Sizer)
静态盒式布局管理器将盒式布局管理器与静态框结合在一起。静态框为布局管理器提供了一个美观的边框和文本标签。
以下是创建静态盒式布局管理器的示例代码:
```python
import wx
from blockwindow import BlockWindow
labels = "one two three four five six seven eight nine".split()
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "StaticBoxSizer Test")
```
0
0
复制全文
相关推荐










