wxPython:GridBagSizer - 可扩展列表对象

时间:2015-06-29 15:08:39

标签: python-2.7 wxpython gridbagsizer

我正在使用GridBagSizer进行UI布局。 现在我面临以下问题。

使用的网格有4行12列。 在第二行(第1行)我使用UltimateListCtrl,如果窗口垂直或水平调整大小,我希望它增长。

ulc_style = ULC.ULC_REPORT | wx.LC_VRULES | wx.LC_HRULES | wx.LC_SINGLE_SEL | ULC.ULC_HAS_VARIABLE_ROW_HEIGHT
self.list = ulc = ULC.UltimateListCtrl(self.panel, agwStyle=ulc_style)    

self.sizer_grid = grid = wx.GridBagSizer(5,5)    
grid.Add(self.list, (1,0), (1,12), flag=wx.EXPAND)

我使用以下函数使列可增长,并将行1设置为可增长。

for i in range(13):
    grid.AddGrowableCol(i)
grid.AddGrowableRow(1)

我可以调整窗口的大小,并且可以使用它调整alle元素的大小,但是垂直列表会保持原样。

如果我将大小参数添加到ListCtrl,行将扩展为我输入的大小,甚至水平扩展,但垂直扩展仍然固定为该大小,不会调整到窗口大小。

grid.AddGrowableRow(1)

似乎没有做任何事情,当我删除它时,ui看起来仍然是一样的。 我是python和wxpython的新手,所以也许我做错了。

所有内容都位于框架中,位于框架中,最后我打电话:

self.panel.SetSizerAndFit(self.sizer_grid)

1 个答案:

答案 0 :(得分:1)

好的,这就是我如何让它像我想要的那样工作。

窗口的完整代码:

class ListView(wx.Frame):
def __init__( self, parent, id) :
    wx.Frame.__init__(self, wx.GetApp().TopWindow, title='Studenten Liste', size=(890, 740))

    self.panel = wx.Panel(self)

    # Font Mods
    font_underline = wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, True)

    # Grid Sizer
    self.sizer_grid = grid = wx.GridBagSizer(5,5)

    # Row 0, Col 0+1
    self.label_auswahl = wx.StaticText(self.panel, label="Auswahl:")
    self.label_auswahl.SetFont(font_underline)
    grid.Add(self.label_auswahl, (0,0), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
    init_choice = ['TEMP1','TEMP2','TEMP3','TEMP4']
    self.input_auswahl = TextCtrlAutoComplete(self.panel, size=(280,24), choices=init_choice, showHead=False)
    grid.Add(self.input_auswahl, (0,1), (1,4), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)

    # Row 0, Col 9,10,11
    self.label_kat = wx.StaticText(self.panel, label="Kategorie:")
    self.label_kat.SetFont(font_underline)
    grid.Add(self.label_kat, (0,9), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
    kategorie_ch = ['Demo1', 'Demo2', 'Demo3']
    self.ch_kategorie = wx.Choice(self.panel, choices=kategorie_ch)
    self.ch_kategorie.db_name = 'kategorie'
    self.ch_kategorie.Bind(wx.EVT_CHOICE, self.OnKatChoice)
    grid.Add(self.ch_kategorie, (0,10), (1,2), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)

    #Row 1, Col 0-12 - Ultimate List Ctrl
    self.list = ulc = UltimateLC(self.panel, 12)
    # Give it some columns.
    # The ID col we'll customize a bit:
    ulc.InsertColumn(0, 'Name:', width=120)
    ulc.InsertColumn(1, 'Vorname:', width=120)
    ulc.InsertColumn(2, 'Anschrift:', width=160)
    ulc.InsertColumn(3, 'Telefon:', width=100)
    ulc.InsertColumn(4, 'eMail:', width=200)
    ulc.InsertColumn(5, 'Studium:', format=ULC.ULC_FORMAT_CENTER, width=60)
    ulc.InsertColumn(6, 'Matr. Nr.:', format=ULC.ULC_FORMAT_CENTER, width=70)
    ulc.InsertColumn(7, 'Hauptfach:', width=100)
    ulc.InsertColumn(8, 'Nebenfach:', width=100)
    ulc.InsertColumn(9, 'Start Sem.:', width=70)
    ulc.InsertColumn(10, 'Letzte Akt.:', width=70)
    ulc.InsertColumn(11, 'Kategorie:', width=70)

    grid.Add(self.list, (1,0), (1,12), flag=wx.EXPAND)


    # Row 2+3
    self.label_sel = wx.StaticText(self.panel, label='Daten Drucken:')
    grid.Add(self.label_sel, (2,0), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)

    # DICT Print Selection
    self.SelectDefs = SelectDefs = {
        # ID: ( Label, Header Name, DB Name, Column Width
        101 : ('Name', 'Name:', 'name', 0.9 ),
        102 : ('Vorame', 'Vorname:', 'vorname', 0.85 ),
        103 : ('Anschrift', 'Anschrift:', 'anschrift', 1.4 ),
        104 : ('Telefon', 'Telefon:', 'tele', 0.9 ),
        105 : ('eMail', 'eMail:', 'email', 1.65 ),
        106 : ('Studium', '', 'studium', 0.31 ),
        107 : ('Matrikel', 'Matrikel:', 'matrikel', 0.6 ),
        108 : ('Hauptfach', 'Haupftach:', 'hauptf', 0.9 ),
        109 : ('Nebenfach', 'Nebenfach:', 'nebenf', 0.9 ),
        110 : ('Start Sem.', 'Start:', 'startsem', 0.6 ),
        111 : ('Letzte Akt.', 'Last:', 'lastakt', 0.6 ),
        112 : ('Kategorie', '', 'kategorie', 0.5 ),
        }
    # Max Width for Portrait or Landscape printout
    self.max_portrait = 7.8
    self.max_landscape = 10.11

    keys = SelectDefs.keys()
    for i,k in enumerate(keys):
        col = i + 1
        row = 2
        if i > 5:
            col = i - 5
            row = 3
        label = SelectDefs[k][0]
        chk = wx.CheckBox(self.panel, k, label)
        grid.Add(chk, (row,col), flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.Bind(wx.EVT_CHECKBOX, self.OnCheckBox, chk)

    self.button_print_sel = wx.Button(self.panel, 201, label="Auswahl Drucken")
    self.button_print_sel.Bind(wx.EVT_BUTTON, self.OnPrint)
    self.button_print_all = wx.Button(self.panel, 202, label="Liste Drucken")
    self.button_print_all.Bind(wx.EVT_BUTTON, self.OnPrint)
    grid.Add(self.button_print_sel, (2,10), (2,1), flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
    grid.Add(self.button_print_all, (2,11), (2,1), flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)

    # Column 8 will Expand, Column 8 only holds the ListCtrl
    grid.AddGrowableCol(8)
    # Row 1 will Expand, Row 1 only holds the ListCtrl
    grid.AddGrowableRow(1)

    # List Binds
    self.list.Bind(ULC.EVT_LIST_ITEM_CHECKED, self.OnCheck)
    self.list.Bind(ULC.EVT_LIST_ITEM_ACTIVATED, self.OnActivated)

    # Lists for the Checked Items
    self.checked_ids = []
    self.checked_sel = []

    # Set Defaults
    self.SetDefaults()

    # Set Min Windows Size
    self.SetMinSize((890, 540))

    # Main Sizer
    self.sizer_v = wx.BoxSizer(wx.VERTICAL)
    self.sizer_v.Add(grid, 1, wx.ALL | wx.EXPAND, 5)
    self.panel.SetSizerAndFit(self.sizer_v)

重要部分是:

  1. 添加列表时设置标志:wx.EXPAND

  2. 使用SetGrowable设置要拉伸的所有列和行。在我的例子中,我只希望列表垂直和水平调整大小,所以我只将行和列设置为可增长的,这是唯一持有列表的行。 有了这个,所有其他元素都保持在它们的位置,是左侧还是右侧。

  3. 最后将所有内容添加到比例= 1且样式为wx.EXPAND的垂直Boxsizer。比例1允许垂直拉伸,wx.EXPAND水平。我猜你可以用水平盒式传感器做同样的事情。 最后的wx.ALL和',5'只在GridBagSizer周围设置一个边距,看起来更漂亮。

  4. PS: 上面的代码需要一些未包含的函数和自定义小部件。

    UltimaListCtrl(使用Sorter Mixin):

    self.list = ulc = UltimateLC(self.panel, 12)
    

    可以替换为:

    self.list = list = wx.ListCtrl(self.panel, ...)
    

    TextCtrlAutoComplete:

    init_choice = ['TEMP1','TEMP2','TEMP3','TEMP4']
    self.input_auswahl = TextCtrlAutoComplete(self.panel, size=(280,24), choices=init_choice, showHead=False)
    

    可以删除或替换。

    一个添加数据并预先选择一些复选框的函数:

    self.SetDefaults()
    

    这个也可以删除。