title: wxpython listctrl and fix column widths
body: <p>I am trying to make a "table" look good within my panel.  This issue I'm having is that the table fills up the panel but everything is to the left.  I would like to have each column be the same size and span the entire width of the panel.  I have seen the ListCtrlAutoWidthMixin but am not sure how I could utilize this.  Here is what I have in code:</p>
  
  <pre><code>        self.Analysis = scrolled.ScrolledPanel(self.Notebook3, -1)
  
          # Set Up Analysis Page (Page has four panels -- I care about Top left one)
          self.AnalysisUL = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
          self.AnalysisUR = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
          self.AnalysisLL = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
          self.AnalysisLR = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
  
          # Top Left Box (Analyze Button and Projected Points Total)
          self.Picks_Left = wx.ListCtrl(self.AnalysisUL,-1,style=wx.LC_REPORT | wx.BORDER_NONE)
          self.Picks_Left.InsertColumn(1,'col1')
          self.Picks_Left.InsertColumn(2,'col2',format=wx.LIST_FORMAT_CENTRE)
          self.Picks_Left.InsertColumn(3,'col3',format=wx.LIST_FORMAT_CENTRE)
          self.Picks_Left.InsertColumn(4,'col4',format=wx.LIST_FORMAT_CENTRE)
  
          self.Picks_Left.SetColumnWidth(0,-2)
          self.Picks_Left.SetColumnWidth(1,-2)
          self.Picks_Left.SetColumnWidth(2,-2)
          self.Picks_Left.SetColumnWidth(3,-2)
  
          # Sizer
          vbox_UL = wx.BoxSizer(wx.VERTICAL)
  
          #Title for Table
          fontUL = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
          self.UL_text = wx.StaticText(self.AnalysisUL, -1, 'Title')
          self.UL_text.SetFont(fontUL)
  
          vbox_UL.Add(self.UL_text, 0, wx.CENTER|wx.ALL,20)
          vbox_UL.Add(self.Picks_Left,1,wx.EXPAND|wx.ALL,3)
          self.AnalysisUL.SetSizer(vbox_UL)
  </code></pre>
  
  <p>Again, the table spans the panel, but all my columns are shifted to the left.  Also, I do not want to set the column size manually (unless I can grab the panel size and then divide by the number of columns I have -- since the program will be used on computers with different resolutions).  I have tried this approach but cannot seem to get the correct size of the panels.  The numbers I get with GetSize() and GetClientSize() are all too small.  </p>
  
  <p>Thanks for any help!</p>
  
  <p>EDIT:  Code Added:</p>
  
  <pre><code>import wx
  import wx.lib.mixins.listctrl as listmix
  import wx.lib.scrolledpanel as scrolled
  import wx.lib.agw.pybusyinfo as PBI
  
  class TMainForm(wx.Frame):
  
      def __init__(self, *args, **kwds):
  
  
              kwds["style"] = wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER
              wx.Frame.__init__(self, *args, **kwds)
  
              self.Splitter1 = wx.SplitterWindow(self, -1)#, style=wx.SP_NOSASH)
              self.Splitter2 = wx.SplitterWindow(self.Splitter1)
  
              self.Panel1 = wx.Panel(self.Splitter2, -1)
              self.Panel2 = wx.Panel(self.Splitter2, -1)
  
              self.Splitter2.SplitHorizontally(self.Panel1,self.Panel2)
  
              self.Panel3 = wx.Panel(self.Splitter1, -1)
              self.Splitter1.SplitVertically(self.Splitter2,self.Panel3,400)
  
              self.Notebook = wx.Notebook(self.Panel1, -1)
              self.MyTeam = scrolled.ScrolledPanel(self.Notebook, -1)
              self.TeamComparison = scrolled.ScrolledPanel(self.Notebook, -1)
  
              self.MyTeam.SetupScrolling()
              self.TeamComparison.SetupScrolling()
  
              self.Notebook3 = wx.Notebook(self.Panel3, -1)
              self.Analysis = scrolled.ScrolledPanel(self.Notebook3, -1)
  
              self.Analysis.SetupScrolling()
  
              self.AnalysisUL = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
              self.AnalysisUR = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
              self.AnalysisLL = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
              self.AnalysisLR = wx.Panel(self.Analysis,-1, style=wx.BORDER_NONE)
  
              # Top Left Box (To Fix!)
              self.Picks_Left = wx.ListCtrl(self.AnalysisUL,-1,style=wx.LC_REPORT | wx.BORDER_NONE)
              self.Picks_Left.InsertColumn(1,'                  ')
              self.Picks_Left.InsertColumn(2,'    ',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(3,'H1',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(4,'H2',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(5,'H#',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(6,'H4',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(7,'H5',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(8,'H6',format=wx.LIST_FORMAT_CENTRE)
              self.Picks_Left.InsertColumn(9,'H7',format=wx.LIST_FORMAT_CENTRE)
  
  ##            table_width = self.Picks_Left.GetSize()[0] #GetSize returns (width, height) tuple
  ##            print table_width
  ##            num_col = self.Picks_Left.GetColumnCount()
  ##            col_width = table_width/num_col
  ##            for i in range(0, num_col):
  ##                self.Picks_Left.SetColumnWidth(i, col_width)
  
              self.Picks_Left.SetColumnWidth(0,-2)
              self.Picks_Left.SetColumnWidth(1,-2)
              self.Picks_Left.SetColumnWidth(2,-2)
              self.Picks_Left.SetColumnWidth(3,-2)
              self.Picks_Left.SetColumnWidth(4,-2)
              self.Picks_Left.SetColumnWidth(5,-2)
              self.Picks_Left.SetColumnWidth(6,-2)
              self.Picks_Left.SetColumnWidth(7,-2)
              self.Picks_Left.SetColumnWidth(8,-2)            
  
              # Bottom Left Box (Suggested Optimal Teams)
              self.Notebook_AltTeams = wx.Notebook(self.AnalysisLL, -1)
              self.Alt_Team_1 = scrolled.ScrolledPanel(self.Notebook_AltTeams, -1)
              self.Alt_Team_2 = scrolled.ScrolledPanel(self.Notebook_AltTeams, -1)
              self.Alt_Team_3 = scrolled.ScrolledPanel(self.Notebook_AltTeams, -1)
              self.Alt_Team_4 = scrolled.ScrolledPanel(self.Notebook_AltTeams, -1)
              self.Alt_Team_5 = scrolled.ScrolledPanel(self.Notebook_AltTeams, -1)
  
              self.Alt_Team_1.SetupScrolling()
              self.Alt_Team_2.SetupScrolling()
              self.Alt_Team_3.SetupScrolling()
              self.Alt_Team_4.SetupScrolling()
              self.Alt_Team_5.SetupScrolling()
  
              # Menu Bar
              self.MainMenu = wx.MenuBar()
              self.FileMenu = wx.Menu()
  
              self.FileOpenItem = wx.MenuItem(self.FileMenu, 103, "&amp;Open\tCtrl+O", "Open a Previous Session", wx.ITEM_NORMAL)
              self.FileMenu.AppendItem(self.FileOpenItem)
              self.FileReloadItem = wx.MenuItem(self.FileMenu, 104, "&amp;Reload Defaults", "Reload Default Files", wx.ITEM_NORMAL)
              self.FileMenu.AppendItem(self.FileReloadItem)
              self.FileSaveItem = wx.MenuItem(self.FileMenu, 102, "&amp;Save\tCtrl+S", "Save the data", wx.ITEM_NORMAL)
              self.FileMenu.AppendItem(self.FileSaveItem)
              self.FileQuitItem = wx.MenuItem(self.FileMenu, wx.ID_EXIT, "&amp;Quit\tCtrl+Q", "Quit the program", wx.ITEM_NORMAL)
              self.FileMenu.AppendItem(self.FileQuitItem)          
              self.MainMenu.Append(self.FileMenu, "&amp;File")
  
              self.SetMenuBar(self.MainMenu)
              # Menu Bar end
  
              self.StatusBar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
  
              self.__set_properties()
              self.__do_layout()
  
              self.Bind(wx.EVT_MENU, self.OnFileQuit, self.FileQuitItem)
              self.Bind(wx.EVT_MENU, self.OnFileSave, self.FileSaveItem)
              self.Bind(wx.EVT_MENU, self.OnFileOpen, self.FileOpenItem)
              self.Bind(wx.EVT_MENU, self.OnFileReload, self.FileReloadItem)
  
              self.OnAnalyze()
  
  
      def __set_properties(self): #Set up GUI Title and Map Window
  
              self.SetTitle("Test")
              screen_x = 95 * wx.GetDisplaySize()[0]/100
              screen_y = 90 * wx.GetDisplaySize()[1]/100
              self.SetSize((screen_x, screen_y))
  
              self.SetFocus()
  
      def __do_layout(self , call_fit = True, set_sizer = True): #Create Lay-Out of GUI
  
              # Sizer for Panel 3 (Analysis Page)
              hbox  = wx.BoxSizer(wx.HORIZONTAL)
  
              vbox1 = wx.BoxSizer(wx.VERTICAL)
              vbox2 = wx.BoxSizer(wx.VERTICAL)
  
              hbox2 = wx.BoxSizer(wx.HORIZONTAL)
  
              vbox1.Add(self.AnalysisUL, 1, wx.EXPAND | wx.ALL, 3)
              vbox1.Add(self.AnalysisLL, 1, wx.EXPAND | wx.ALL, 3)
              vbox2.Add(self.AnalysisUR, 1, wx.EXPAND | wx.ALL, 3)
              vbox2.Add(self.AnalysisLR, 1, wx.EXPAND | wx.ALL, 3)
  
              # Analysis Button Panel
              vbox_UL = wx.BoxSizer(wx.VERTICAL)
              vbox_UL3 = wx.BoxSizer(wx.HORIZONTAL)
  
              fontUL = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
              self.UL_text = wx.StaticText(self.AnalysisUL, -1, 'Title 1')
              self.UL_text.SetFont(fontUL)
  
              Exp_Pts = ' '
  
              fontUL = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
              self.ULText1 = wx.StaticText(self.AnalysisUL, -1, 'Title 2')
              self.ULText2 = wx.StaticText(self.AnalysisUL, -1, Exp_Pts)
  
              self.ULText1.SetFont(fontUL)
              self.ULText2.SetFont(fontUL)
              self.ULText2.SetForegroundColour((0,0,255))
              self.ULText1.SetForegroundColour((0,0,255))
  
              hbox2.Add(self.ULText1, 0)
              hbox2.Add(self.ULText2, 0)
  
              vbox_UL.Add(self.UL_text, 0, wx.CENTER|wx.ALL,20)
              vbox_UL.Add(self.Picks_Left,1,wx.EXPAND|wx.ALL,3)
              vbox_UL.Add(hbox2, 0, wx.CENTER|wx.BOTTOM,50)
              self.AnalysisUL.SetSizer(vbox_UL)
  
              # Suggested Pick Panel
              vbox_LR = wx.BoxSizer(wx.HORIZONTAL)
              vbox_LR2 = wx.BoxSizer(wx.VERTICAL)
  
              font2 = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
  
              SuggestedSelection = ' '
  
              self.SuggestedText1 = wx.StaticText(self.AnalysisLR, -1, ' ')
              self.SuggestedText2 = wx.StaticText(self.AnalysisLR, -1, SuggestedSelection)
  
              self.SuggestedText1.SetFont(font2)
              self.SuggestedText2.SetFont(font2)
              self.SuggestedText2.SetForegroundColour((0,0,255))
  
              vbox_LR2.Add(self.SuggestedText1,0,wx.ALIGN_CENTRE)
  
              vbox_LR2.Add(wx.StaticText(self.AnalysisLR, -1, ''),0,wx.CENTER)
              vbox_LR2.Add(wx.StaticText(self.AnalysisLR, -1, ''),0,wx.CENTER)
  
              vbox_LR2.Add(self.SuggestedText2,0,wx.ALIGN_CENTRE)
              vbox_LR.Add(vbox_LR2,1,wx.CENTER)
              self.AnalysisLR.SetSizer(vbox_LR)
  
              # Projected Team Panel
              sizer_LL = wx.BoxSizer(wx.VERTICAL)
              self.Alt_Team_1.SetSizer(sizer_LL)
  
              sizer_LL = wx.BoxSizer(wx.VERTICAL)
              self.Alt_Team_2.SetSizer(sizer_LL)
  
              sizer_LL = wx.BoxSizer(wx.VERTICAL)
              self.Alt_Team_3.SetSizer(sizer_LL)
  
              sizer_LL = wx.BoxSizer(wx.VERTICAL)
              self.Alt_Team_4.SetSizer(sizer_LL)
  
              sizer_LL = wx.BoxSizer(wx.VERTICAL)
              self.Alt_Team_5.SetSizer(sizer_LL)
  
              # Picks Remaining Panel
              vbox_UR = wx.BoxSizer(wx.VERTICAL)
  
              fontUR = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
              self.UR_text = wx.StaticText(self.AnalysisUR, -1, 'Title')
              self.UR_text.SetFont(fontUR)
  
              vbox_UR.Add(self.UR_text, 0, wx.CENTER)
              self.AnalysisUR.SetSizer(vbox_UR)
  
              # Finish Analysis Sizers
              hbox.Add(vbox1, 1, wx.EXPAND)
              hbox.Add(vbox2, 1, wx.EXPAND)
              self.Analysis.SetSizer(hbox)
  
              # Add Notebook Pages
              self.Notebook.AddPage(self.MyTeam,"A")
              self.Notebook.AddPage(self.TeamComparison,"B")
  
              self.Notebook3.AddPage(self.Analysis,"CHECK ME")
  
              self.Notebook_AltTeams.AddPage(self.Alt_Team_1,"1")
              self.Notebook_AltTeams.AddPage(self.Alt_Team_2,"2")
              self.Notebook_AltTeams.AddPage(self.Alt_Team_3,"3")
              self.Notebook_AltTeams.AddPage(self.Alt_Team_4,"4")
              self.Notebook_AltTeams.AddPage(self.Alt_Team_5,"5")
  
              #Sizer for Panel 1
              sizer_P1 = wx.BoxSizer(wx.VERTICAL)
              sizer_P1.Add(self.Notebook, 1, wx.EXPAND, 0)
              self.Panel1.SetSizer(sizer_P1)
  
              #Sizer for Panel 3
              sizer_P3 = wx.BoxSizer(wx.VERTICAL)
              sizer_P3.Add(self.Notebook3, 1, wx.EXPAND, 0)
              self.Panel3.SetSizer(sizer_P3)
  
              #Sizer for Panel (Alt_Teams)
              fontLL = wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.BOLD)
              self.LL_text = wx.StaticText(self.AnalysisLL, -1, 'Title')
              self.LL_text.SetFont(fontLL)
  
              vbox_LL = wx.BoxSizer(wx.VERTICAL)
              vbox_LL.Add(self.LL_text, 0, wx.CENTER)
              #vbox_LL.Add(self.Notebook_AltTeams,1,wx.EXPAND,0)
              self.AnalysisLL.SetSizer(vbox_LL)
  
              # Split Panel Sizer
              sizer = wx.BoxSizer(wx.VERTICAL)
              sizer.Add(self.Splitter1,1,wx.EXPAND)
              self.SetSizer(sizer)
  
              self.Layout()
              self.Centre()
  
  
      # Function closes GUI 
      def OnFileQuit(self,event):
          self.Close()
  
      # Function reloads default parameters/lists
      def OnFileReload(self,event):
          self.Close()
  
  
      # Function loads previously saved files
      def OnFileOpen(self,event):
          self.Close()
  
      # Function saves current work
      def OnFileSave(self,event):
          self.Close()
  
      # Function analyzes draft, points, adp to suggest an optimal team and the next selection
      def OnAnalyze(self):
  
          self.Picks_Left.DeleteAllItems()
  
  
          self.Picks_Left.InsertStringItem(0, ' ')
          self.Picks_Left.InsertStringItem(1, 'Line 1')
          self.Picks_Left.InsertStringItem(2, ' ')
          self.Picks_Left.InsertStringItem(3, 'Line 2')
          self.Picks_Left.InsertStringItem(4, ' ')
          self.Picks_Left.InsertStringItem(5, 'Line 3')
  
          self.Picks_Left.SetStringItem(1,2, '1')
          self.Picks_Left.SetStringItem(1,3, '2')
          self.Picks_Left.SetStringItem(1,4, '3')
          self.Picks_Left.SetStringItem(1,5, '4')
          self.Picks_Left.SetStringItem(1,6, '5')
          self.Picks_Left.SetStringItem(1,7, '6')
          self.Picks_Left.SetStringItem(1,8, '7')
  
          self.Picks_Left.SetStringItem(3,2, '1')     
          self.Picks_Left.SetStringItem(3,3, '1')
          self.Picks_Left.SetStringItem(3,4, '1')
          self.Picks_Left.SetStringItem(3,5, '1')
          self.Picks_Left.SetStringItem(3,6, '1')
          self.Picks_Left.SetStringItem(3,7, '1')
          self.Picks_Left.SetStringItem(3,8, '1')
  
          self.Picks_Left.SetStringItem(5,2, '2')        
          self.Picks_Left.SetStringItem(5,3, '2')   
          self.Picks_Left.SetStringItem(5,4, '2')   
          self.Picks_Left.SetStringItem(5,5, '2')   
          self.Picks_Left.SetStringItem(5,6, '2')   
          self.Picks_Left.SetStringItem(5,7, '2')   
          self.Picks_Left.SetStringItem(5,8, '2')   
  
          self.AnalysisUL.Layout()
  
  app = wx.App(0)
  
  # Code to Execute File
  class TApplication(wx.App):
      def OnInit(self):
  
              wx.InitAllImageHandlers()
              MainForm = TMainForm(None, -1,"")
              self.SetTopWindow(MainForm)
  
              MainForm.Show()
              return 1
  
  if __name__ == "__main__":
      Application = TApplication(0)
      Application.MainLoop()
  </code></pre>