Frage

Ich arbeite in wx.Python und ich möchte die Spalten meines wx.ListCtrl bekommen Auto-Größe ändern, dh die Breite der Spaltennamen und sonst so breit wie die breiteste Element oder dessen Spaltenname mindestens zu sein . Zuerst dachte ich, das ListCtrlAutoWidthMixin könnte dies tun, aber es ist nicht so sieht es aus wie ich, es könnte zu tun haben, mich (Bitte korrigieren Sie mich, wenn es eine in Art und Weise, dies zu tun gebaut ist !!!)

Wie kann ich herausfinden, wie weit die Titel und Elemente meiner Liste gemacht werden?

War es hilfreich?

Lösung

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

Betrachten wir ein wx.Grid verwenden, hier ist ein kleines Beispiel, 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()

Andere Tipps

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

Wenn Sie möchten, dass sich eine Menge Kopfschmerzen wx.ListCtrl Bezug sparen, sollten Sie wechseln zu verwenden Object (hat ein schönes Kochbuch und Forum für die Code-Beispiele). Es ist sehr schön und ich neige dazu, es für etwas zu verwenden mehr als eine sehr grundlegende ListCtrl, weil es extrem leistungsfähig und flexibel und einfach zu codieren auf. Hier der wxPyWiki damit verbundenen (einschließlich Beispielcode). Der Entwickler ist auch auf der WxPython Mailing-Liste, so dass Sie bei Fragen eine E-Mail kann.

Dies 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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top