我正在使用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)
答案 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)
重要部分是:
添加列表时设置标志:wx.EXPAND
使用SetGrowable设置要拉伸的所有列和行。在我的例子中,我只希望列表垂直和水平调整大小,所以我只将行和列设置为可增长的,这是唯一持有列表的行。 有了这个,所有其他元素都保持在它们的位置,是左侧还是右侧。
最后将所有内容添加到比例= 1且样式为wx.EXPAND的垂直Boxsizer。比例1允许垂直拉伸,wx.EXPAND水平。我猜你可以用水平盒式传感器做同样的事情。 最后的wx.ALL和',5'只在GridBagSizer周围设置一个边距,看起来更漂亮。
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()
这个也可以删除。