2015-06-29 32 views
2

即時通訊GridBagSizer用於我的UI佈局。 現在即時通訊面臨以下問題。wxPython:GridBagSizer - 可擴展列表對象

使用的網格有4行12列。 在第二行(第1行)我ad 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) 

我可以調整窗口horzizontally罰款和alle元素調整大小,但垂直列表保持它在哪裏。

如果我將大小參數添加到ListCtrl中,該行將擴展爲我輸入的大小,甚至在水平方向上進一步水平擴展,但仍然固定爲該尺寸,並且不會調整爲窗口大小。

grid.AddGrowableRow(1) 

似乎沒有做任何事情,當我刪除它,UI仍然看起來一樣。 即時通訊新的python和wxpython所以也許我做錯了什麼。

一切都坐落在,在幀坐在一個小組,在結束時,我打電話:

self.panel.SetSizerAndFit(self.sizer_grid) 
+0

你能提供一個小的可運行示例嗎? – GP89

+0

我仍然需要學習清理我的代碼......我只是發佈了這個代碼片段,因爲它的其他東西依賴於數據庫和其他數據...但我設法通過將GridBagSizer放入Boxsizer中來自行修復它(垂直)。當我回家時,我會發布我的解決方案。 – Sonic

回答

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周圍設置了一個邊界,它看起來更加美觀。

PS: 上面的代碼需要一些函數和不包含的自定義小部件。

UltimaListCtrl(用分揀機密新):

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() 

這一個可以移除。