wxpython筆記:wxpython的界面布局方式(二)


前言

前面wxpython筆記:wxpython的界面布局方式(一)介紹了Grid、Box、Static box三種布局方式,還剩下Flex grid與Grid bag沒有介紹。

  • Flex grid:對grid sizer稍微做了些改變,當窗口部件有不同的尺寸時,可以有更好的結果。
  • Grid bag:grid sizer系列中最靈活的成員。使得網格中的窗口部件可以更隨意的放置。

flex grid sizer和grid bag sizer本質上是grid的變種。

 

flex grid sizer

flex grid sizer是grid sizer的一個更靈活的版本。它與標准的grid sizer幾乎相同,除了下面的例外:

  • 1、每行和每列可以有各自的尺寸。通過proportion參數。
  • 2、默認情況下,當尺寸調整時,它不改變它的單元格的尺寸。如果需要的話,你可以指定哪行或哪列應該增長。
  • 3、它可以在兩個方向之一靈活地增長,意思是你可以為個別的子元素指定比列量,並且你可以指定固定方向上的行為。

例如:

一個flex grid sizer是wx.FlexGridSizer的一個實例。類wx.FlexGridSizer是wx.GridSizer的子類,所以wx.GridSizer的屬性方法依然有效。

wx.FlexGridSizer的構造函數與其父類的相同:

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

為了當sizer擴展時,使一行或列也擴展,你需要使用適當的方法顯式地告訴該sizer該行或列是可擴展的:

AddGrowableCol(index, proportion=0) #指定某列的proportion參數
AddGrowableRow(index, proportion=0) #指定某行的proportion參數

當sizer水平擴展時,關於新寬度的默認行為被等同地分配給每個可擴展的列。同樣,一個垂直的尺寸調整也被等同地分配給每個可擴展的行。

要改變這個默認的行為並且使不同的行和列有不現的擴展比率,你需要使用proportion參數。如果proportion參數被使用了,那么與該參數相關的新的空間就被分配給了

相應的行或列。例如,如果你有兩個尺寸可調整的行,並且它們的proportion分別是2和1,那么這第一個行將得到新空間的2/3,第二行將得到1/3。

實例

import wx

class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title = title, size = (300, 250))
        self.InitUI()
        self.Centre()
        self.Show()

    def InitUI(self):
        panel = wx.Panel(self)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        # 三行兩列
        fgs = wx.FlexGridSizer(3, 2, 10 ,10)
        title = wx.StaticText(panel, label = "Title")
        author = wx.StaticText(panel, label = "Name of the Author")
        review = wx.StaticText(panel, label = "Review")
        tc1 = wx.TextCtrl(panel)
        tc2 = wx.TextCtrl(panel)
        tc3 = wx.TextCtrl(panel, style = wx.TE_MULTILINE)
     
        fgs.AddMany([(title), (tc1, 1, wx.EXPAND), (author),
                     (tc2, 1, wx.EXPAND), (review, 1, wx.EXPAND), (tc3, 1, wx.EXPAND)])
        fgs.AddGrowableRow(2, 3) #第3行,占3/5
        fgs.AddGrowableCol(1, 3) #第2列,占3/5
        hbox.Add(fgs, proportion = 2, flag = wx.ALL |wx.EXPAND, border = 15)
        panel.SetSizer(hbox)
app = wx.App()
Example(None, title = 'FlexGridSizer')
app.MainLoop( )

 

 

 

 

grid bag sizer

grid bag sizer是對flex grid sizer進一步的增強。在grid bag sizer中有兩個新的變化:
1、能夠將一個窗口部件添加到一個特定的單元格。
2、能夠使一個窗口部件跨越幾個單元格(就像HTML表單中的表格所能做的一樣)。

例如:

grid bag sizer是wx.GridBagSizer的實例,wx.GridBagSizer是wx.FlexGridSizer的一個子類。這意味着所有flex grid sizer的屬性,grid bag sizer都適用。
wx.GridBagSizer的構造函數與它的父類有點不同:

wx.GridBagSizer(vgap=0, hgap=0)

在一個grid bag sizer中,你不必去指定行和列的數量,因為你可以直接將子項目添加進特定的單元格——sizer將據此計算出網格的尺度。
重點:

在grid bag sizer中add方法也不一樣:

 Add(window, pos, span=wx.DefaultSpan, flag=0, border=0,
userData=None)
 Add(sizer, pos, span=wx.DefaultSpan, flag=0, border=0,
userData=None)
 Add(size, pos, span=wx.DefaultSpan, flag=0, border=0,
userData=None)
 AddItem(item)
其實重要的是兩個參數,因為grid bag sizer中你沒有指定行和列,所以,每一個控件在哪個位置,占據多大的空間,都需要手動調整。
pos參數代表sizer中的窗口部件要賦予的單元格。
pos參數其實就是一個二維地址,從0開始計算
span參數代表窗口部件應該占據的行和列的數量。
span參數是你設置控件占據的大小,占多少行,占多少列

實例

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):
        panel = wx.Panel(self)
        sizer = wx.GridBagSizer(0, 0)

        #pos=(0, 0):放在1行1列,不設置span,默認span=(1,1)占一行一列的大小
        text = wx.StaticText(panel, label="Name:")
        sizer.Add(text, pos=(0, 0), flag=wx.ALL, border=5)

        # pos=(0, 1):放在1行2列,span=(1, 3),占一行三列的大小
        tc = wx.TextCtrl(panel)
        sizer.Add(tc, pos=(0, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)

        # pos=(0, 4):放在1行5列,span=(6, 3),占六行三列的大小
        #這里為什么是第5列,因為第一行前面兩個控件span=(1,1),span=(1, 3),1+3=4。
        tc4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc4, pos=(0, 4), span=(6, 3), flag=wx.EXPAND | wx.ALL, border=5)

        text1 = wx.StaticText(panel, label="address")
        tc1 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(text1, pos=(1, 0), flag=wx.ALL, border=5)
        sizer.Add(tc1, pos=(1, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)


        text2 = wx.StaticText(panel, label="age")
        sizer.Add(text2, pos=(2, 0), flag=wx.ALL, border=5)
        tc2 = wx.TextCtrl(panel)
        sizer.Add(tc2, pos=(2, 1), flag=wx.ALL, border=5)
        text3 = wx.StaticText(panel, label="Mob.No")
        sizer.Add(text3, pos=(2, 2), flag=wx.ALIGN_CENTER | wx.ALL, border=5)
        tc3 = wx.TextCtrl(panel)
        sizer.Add(tc3, pos=(2, 3), flag=wx.EXPAND | wx.ALL, border=5)


        text4 = wx.StaticText(panel, label="Description")
        sizer.Add(text4, pos=(3, 0), flag=wx.ALL, border=5)
        tc4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        sizer.Add(tc4, pos=(3, 1), span=(1, 3), flag=wx.EXPAND | wx.ALL, border=5)
        sizer.AddGrowableRow(3)


        panel.SetSizerAndFit(sizer)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM