Frage

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:

        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)

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.

Thanks for any help!

EDIT: Code Added:

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, "&Open\tCtrl+O", "Open a Previous Session", wx.ITEM_NORMAL)
            self.FileMenu.AppendItem(self.FileOpenItem)
            self.FileReloadItem = wx.MenuItem(self.FileMenu, 104, "&Reload Defaults", "Reload Default Files", wx.ITEM_NORMAL)
            self.FileMenu.AppendItem(self.FileReloadItem)
            self.FileSaveItem = wx.MenuItem(self.FileMenu, 102, "&Save\tCtrl+S", "Save the data", wx.ITEM_NORMAL)
            self.FileMenu.AppendItem(self.FileSaveItem)
            self.FileQuitItem = wx.MenuItem(self.FileMenu, wx.ID_EXIT, "&Quit\tCtrl+Q", "Quit the program", wx.ITEM_NORMAL)
            self.FileMenu.AppendItem(self.FileQuitItem)          
            self.MainMenu.Append(self.FileMenu, "&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()
War es hilfreich?

Lösung

I think the trouble with the GetSize() approach might have been that you were calling it before the effects of the sizer took place, so it was returning the original size of the ListCtrl before the sizer resized it to fit the panel. Try this code after the last line of your code:

table_width = self.Picks_Left.GetSize()[0] #GetSize returns (width, height) tuple
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)

Andere Tipps

You should use the RowColSizer, which is quite fit for your request. Here is a small demo how to use it:

import  wx  
import  wx.lib.rcsizer  as rcs

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        sizer = rcs.RowColSizer()

        text = "This sizer lays out it's items by row and column "\
               "that are specified explicitly when the item is \n"\
               "added to the sizer.  Grid cells with nothing in "\
               "them are supported and column- or row-spanning is \n"\
               "handled as well.  Growable rows and columns are "\
               "specified just like the wxFlexGridSizer."

        sizer.Add(wx.StaticText(self, -1, text), row=1, col=1, colspan=5)

        sizer.Add(wx.TextCtrl(self, -1, "(3,1)"), flag=wx.EXPAND, row=3, col=1)
        sizer.Add(wx.TextCtrl(self, -1, "(3,2)"), row=3, col=2)
        sizer.Add(wx.TextCtrl(self, -1, "(3,3)"), row=3, col=3)
        sizer.Add(wx.TextCtrl(self, -1, "(3,4)"), row=3, col=4)
        sizer.Add(
            wx.TextCtrl(self, -1, "(4,2) span:(2,2)"), 
            flag=wx.EXPAND, row=4, col=2, rowspan=2, colspan=2
            )

        sizer.Add(wx.TextCtrl(self, -1, "(6,4)"), row=6, col=4)
        sizer.Add(wx.TextCtrl(self, -1, "(7,2)"), row=7, col=2)
        sizer.Add(wx.TextCtrl(self, -1, "(8,3)"), row=8, col=3)
        sizer.Add(
            wx.TextCtrl(self, -1, "(10,1) colspan: 4"), 
            flag=wx.EXPAND, pos=(10,1), colspan=4
            )

        sizer.Add(
            wx.TextCtrl(self, -1, "(3,5) rowspan: 8, growable col", style=wx.TE_MULTILINE),
            flag=wx.EXPAND, pos=(3,5), size=(8,1)
            )

        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(wx.Button(self, -1, "A vertical box"), flag=wx.EXPAND)
        box.Add(wx.Button(self, -1, "sizer put in the"), flag=wx.EXPAND)
        box.Add(wx.Button(self, -1, "RowColSizer at (12,1)"), flag=wx.EXPAND)
        sizer.Add(box, pos=(12,1))

        sizer.Add(
            wx.TextCtrl(self, -1, "(12,2) align bottom"), 
            flag=wx.ALIGN_BOTTOM, pos=(12,2)
            )

        sizer.Add(
            wx.TextCtrl(self, -1, "(12,3) align center"), 
            flag=wx.ALIGN_CENTER_VERTICAL, pos=(12,3)
            )

        sizer.Add(wx.TextCtrl(self, -1, "(12,4)"),pos=(12,4))
        sizer.Add(
            wx.TextCtrl(self, -1, "(12,5) full border"), 
            flag=wx.EXPAND|wx.ALL, border=15, pos=(12,5)
            )

        sizer.AddGrowableCol(5)
        sizer.AddGrowableRow(9)

        sizer.AddSpacer(10,10, pos=(1,6))
        sizer.AddSpacer(10,10, pos=(13,1))

        self.SetSizer(sizer)
        self.SetAutoLayout(True)


app = wx.App()
frame = wx.Frame(None, -1)
pn = TestPanel(frame)
frame.Show()
frame.Maximize()
app.MainLoop()

The same request also could be achieved by a more fancy way use the aui

Hope it helps you out.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top