2009-04-06 13 views
1

Ich arbeite in Wx.Python und ich möchte die Spalten meiner wx.ListCtrl auf die automatische Größe ändern, d. H. Mindestens die Breite des Spaltennamens und ansonsten so breit wie das breiteste Element oder dessen Spaltenname. Zuerst dachte ich, die ListCtrlAutoWidthMixin könnte dies tun, aber es sieht nicht so aus, als ob ich es selbst tun müsste (Bitte korrigieren Sie mich, wenn es eine eingebaute Möglichkeit dafür gibt !!!)Wie kann ich die Breite einer wx.ListCtrl und ihren Spaltennamen erhalten?

Wie kann ich finden wie weit die Titel und Elemente meiner Liste gerendert werden?

Antwort

2

Ja, Sie müssten dies selbst für wx.ListCtrl machen und ich bin mir nicht sicher, ob es einfach (oder elegant) wäre, es richtig zu machen.

Betrachten wir ein wx.Grid verwenden, hier ein kleines Beispiel ist, um Sie gehen:

import wx, wx.grid 

class GridData(wx.grid.PyGridTableBase): 
    _cols = "This is a long column name,b,c".split(",") 
    _data = [ 
     "1 2 3".split(), 
     "4,5,And here is a long cell value".split(","), 
     "7 8 9".split() 
    ] 

    def GetColLabelValue(self, col): 
     return self._cols[col] 

    def GetNumberRows(self): 
     return len(self._data) 

    def GetNumberCols(self): 
     return len(self._cols) 

    def GetValue(self, row, col): 
     return self._data[row][col] 


class Test(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     grid = wx.grid.Grid(self) 
     grid.SetTable(GridData()) 
     grid.EnableEditing(False) 
     grid.SetSelectionMode(wx.grid.Grid.SelectRows) 
     grid.SetRowLabelSize(0) 
     grid.AutoSizeColumns() 


app = wx.PySimpleApp() 
app.TopWindow = Test() 
app.TopWindow.Show() 
app.MainLoop() 
3

Wenn Sie sich eine Menge Kopfschmerzen wx.ListCtrl Bezug speichern möchten Sie wechseln sollte mit ObjectListView (hat ein schönes Kochbuch und ein Forum für Codebeispiele). Es ist sehr nett und ich neige dazu, es für etwas mehr als ein sehr einfaches ListCtrl zu verwenden, weil es extrem leistungsfähig und flexibel ist und einfach zu codieren. Hier ist the wxPyWiki page damit verbunden (einschließlich Beispielcode). Der Entwickler befindet sich auch auf der wxPython-Mailingliste, sodass Sie eine E-Mail mit Fragen senden können. Diese

1

funktioniert für mich

import wx 

class Frame(wx.Frame): 
    def __init__(self, *args, **kw): 
     wx.Frame.__init__(self, *args, **kw) 

     self.list = wx.ListCtrl(self, style=wx.LC_REPORT) 
     items = ['A', 'b', 'something really REALLY long'] 
     self.list.InsertColumn(0, "AA") 
     for item in items: 
      self.list.InsertStringItem(0, item) 
     self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) 

app = wx.App(False) 
frm = Frame(None, title="ListCtrl test") 
frm.Show() 
app.MainLoop() 
+0

Ich glaube, Sie wx.LIST_AUTOSIZE_USEHEADER wollen - sonst ist es nicht die Spaltenüberschrift Text betrachten, nur den Text der Datenwerte. –

4

Zusätzlich zu jakepars Antwort: Dies sollte prüfen, ob der Header größer ist, oder das Element, das den meisten Platz in der Spalte nimmt. Nicht elegant, aber funktioniert ...

import wx 

class Frame(wx.Frame): 
    def __init__(self, *args, **kw): 
     wx.Frame.__init__(self, *args, **kw) 

     self.list = wx.ListCtrl(self, style=wx.LC_REPORT) 
     items = ['A', 'b', 'something really REALLY long'] 
     self.list.InsertColumn(0, "AAAAAAAAAAAAAAAAAAAAAAAA") 
     for item in items: 
      self.list.InsertStringItem(0, item) 
     self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) 
     a = self.list.GetColumnWidth(0) 
     print "a " + str(a) 
     self.list.SetColumnWidth(0,wx.LIST_AUTOSIZE_USEHEADER) 
     b = self.list.GetColumnWidth(0) 
     print "b " + str(b) 
     if a>b: 
      print "a is bigger" 
      self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) 
app = wx.App(False) 
frm = Frame(None, title="ListCtrl test") 
frm.Show() 
app.MainLoop()