---
# System prepended metadata

title: 'Layout: BoxSizer'
tags: [wxPython]

---

Layout: BoxSizer
===

BoxSizer可以將元件一起排列在同一列或者同一行

## 範例Error

範例中有一行會造成無法執行：

```python
vbox.Add(l1, 0,  wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 20)
```

**`wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL`** 這三種組合無法同時存在

* **`wx.ALL`**
  * 相對所有\(包含上`wx.TOP`, 下`wx.BOTTOM`, 左`wx.LEFT`, 右`wx.RIGHT`\)的邊界距離，最右邊參數則是要距離多遠
* **`wx.EXPAND`**
  * **水平方向建立box**`wx.BoxSizer(wx.HORIZONTAL)`，延伸填滿視窗**高度**
  * **垂直方向建立box**`wx.BoxSizer(wx.VERTICAL)`，延伸填滿視窗**寬度**
* **`wx.ALIGN_CENTER_HORIZONTAL`**
  * 水平置中

無效組合：`wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL`

## 參數解釋

```python
Box.Add(control, proportion, flag, border)
```

* 第一個參數
  * wx widget instance，如：
    * `lb = wx.StaticText(..)` 或
    * `panel = wx.Panel(self) subPanel = wx.Panel(panel)` ，注意此instance為巢狀式`Panel()`的instance
* 第二個參數

  一個縮放的比例值。佔根據建立的BoxSizer instance其所有widget的`proportion`總和的比例。即`比例值/proportion總和`。如：

```python
import wx

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title)

        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):
        vbox = wx.BoxSizer(wx.HORIZONTAL)

        panel = wx.Panel(self)
        panel.SetBackgroundColour('black')
        
        p1 = wx.Panel(panel)
        p1.SetBackgroundColour('yellow')

        p2 = wx.Panel(panel)
        p2.SetBackgroundColour('red')

        vbox.Add(p1, 1, wx.EXPAND, 0)
        vbox.Add(p2, 2, wx.EXPAND, 0)

        panel.SetSizer(vbox)

app = wx.App()
Example(None, title='Demo')
app.MainLoop()
```

`p1`佔了總畫面的1/3，`p2`佔了總畫面的2/3：

![](https://i.imgur.com/3Fqan9f.png)


若將`vbox = wx.BoxSizer(wx.HORIZONTAL)`改為`vbox = wx.BoxSizer(wx.VERTICAL)`：

![](https://i.imgur.com/2dRzvFb.png)


* 第三個參數 調整此widget的排版。如：距離邊界多遠、填滿畫面、置中等等
* 第四個參數 相對於第三個參數，若第三個參數是有需要帶參數的，則此參數就有意義。如 把上述範例的12行、13行 改成： `vbox.Add(p1, 1, wx.EXPAND|wx.ALL , 10)  vbox.Add(p2, 2, wx.EXPAND|wx.TOP, 50)`

![](https://i.imgur.com/WCHzSGd.png)




## Ref.

[en](https://www.tutorialspoint.com/wxpython/wx\_boxsizer.htm)

[ch](http://www.tw511.com/3/48/1635.html)

[https://wxpython.org/Phoenix/docs/html/sizers\_overview.html](https://wxpython.org/Phoenix/docs/html/sizers\_overview.html)



###### tags: `wxPython`