2012-07-03 15 views
11

Ho tre colonne nel mio wx.ListCtrl(size=(-1,200)). Vorrei che le colonne riempissero la larghezza del ListCtrl dopo la sua creazione. Idealmente, la prima colonna può espandersi per riempire lo spazio extra disponibile. La seconda e la terza colonna non hanno bisogno di espandersi e preferibilmente non cambieranno in larghezza (formattazione ocd).Crea larghezza colonna occupa spazio disponibile in wxPython ListCtrl

Attualmente, ogni colonna ListCtrl è impostata utilizzando (width=-1).

Ho la sensazione che posso usare questa sezione del codice a mio vantaggio ...

# Expand first column to fit longest entry item 
list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE) 

pseudo-codice (forse):

# After wx.ListCtrl creation 
Get width of ListCtrl control 
Get width of each ListCtrl column 
Calculate unused width of ListCtrl 
Set first column width to original width + unused width 

Aggiunto:

Dato il seguente esempio, non capisco come avviare autowidthxxin. Attualmente, sto provando a mettere il listctrl dentro un foldpanel. Il foldpanel è una classe e una funzione all'interno della classe crea il listctrl. Non sono nemmeno sicuro che questo possa essere fatto data la struttura del mio codice al momento!

class MyPanel(wx.Panel): 

    def __init__(self, parent, dictionary): 
     self.dictionary = dictionary 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 

     # Layout helpers (sizers) and content creation (setPanel) 
     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(self.mainSizer) 
     list_ctrl = self.setPanel() 
     self.mainSizer.Add(list_ctrl, 0, wx.ALL | wx.EXPAND, 5) 
     self.GetSizer().SetSizeHints(self) 

    def setPanel(self): 
     index = 0 

     list_ctrl = wx.ListCtrl(self, size=(-1, 200), 
           style=wx.LC_REPORT | wx.BORDER_SUNKEN) 

     list_ctrl.InsertColumn(0, "Variable", format=wx.LIST_FORMAT_LEFT, width=-1) 
     list_ctrl.InsertColumn(1, "x", format=wx.LIST_FORMAT_RIGHT, width=-1) 
     list_ctrl.InsertColumn(2, u"\u03D0", format=wx.LIST_FORMAT_RIGHT, width=-1) 

     for key, value in self.dictionary.iteritems(): 
      list_ctrl.InsertStringItem(index, str(key)) 
      list_ctrl.SetStringItem(index, 1, ("%.2f" % value[0])) 
      list_ctrl.SetStringItem(index, 2, ("%.8f" % value[1])) 
      index += 1 

     list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE) 
     list_ctrl.SetColumnWidth(1, wx.LIST_AUTOSIZE) 
     list_ctrl.SetColumnWidth(2, wx.LIST_AUTOSIZE) 

     return list_ctrl 

risposta

13

È necessario utilizzare la classe di mixin ListCtrlAutoWidthMixin. L'applicazione demo wxPython ha un esempio nella demo di ListCtrl. Secondo lo documentation, puoi usare il suo metodo setResizeColumn per dirgli quale colonna ridimensionare. L'impostazione predefinita è l'ultima colonna.

EDIT (07/05/2012): Nel codice, creare una classe ListCtrl simile a quella nella demo. Sarebbe simile a questa:

class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin): 
    def __init__(self, parent, ID, pos=wx.DefaultPosition, 
       size=wx.DefaultSize, style=0): 
     wx.ListCtrl.__init__(self, parent, ID, pos, size, style) 
     listmix.ListCtrlAutoWidthMixin.__init__(self) 
     self.setResizeColumn(0) 

Poi, quando si crea un'istanza di esso, che ci basta chiamare list_ctrl = TestListCtrl (arg1, arg2 ... argN)

nota che ho inserito una chiamata a setResizeColumn () nel mio codice sopra. Non è testato, ma dovrebbe funzionare.

+0

Aggiunta di alcune informazioni aggiuntive e frammenti di codice. Non riesco a capire come usare la classe di mixin dato il layout del mio codice atm. –

Problemi correlati