2

我将 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)

我可以水平调整窗口大小,并调整所有元素的大小,但垂直列表保持在原来的位置。

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

grid.AddGrowableRow(1)

似乎没有做任何事情,当我删除它时,用户界面看起来仍然一样。我是 python 和 wxpython 的新手,所以我可能做错了什么。

一切都放在框架中的面板中,最后我调用:

self.panel.SetSizerAndFit(self.sizer_grid)
4

1 回答 1

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 水平拉伸。我猜你可以用水平 boxsizer 做同样的事情。最后的 wx.ALL 和 ',5' 只在 GridBagSizer 周围设置了一个边距,这在 imo 中看起来更好。

PS:上面的代码需要一些没有包含的功能和自定义小部件。

UltimaListCtrl(使用 Sorter Mixin):

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

可以替换为:

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

文本Ctrl自动完成:

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

可以移除或更换。

还有一个添加数据并预选一些复选框的功能:

self.SetDefaults()

这个也可以去掉。

于 2015-06-30T15:57:23.590 回答