Question

Je travaille dans wx.Python et je veux les colonnes de mon wx.ListCtrl à auto-redimensionnez-à-dire d'être au minimum la largeur du nom de la colonne et par ailleurs aussi large que l'élément le plus large ou son nom de colonne . Au début, je pensais que le ListCtrlAutoWidthMixin pourrait le faire, mais il ne le fait pas il semble que je pourrais avoir à faire moi-même (S'il vous plaît me corriger s'il y a construit dans le moyen de le faire !!!)

Comment puis-je savoir comment large seront rendus les titres et les éléments de ma liste?

Était-ce utile?

La solution

Oui, vous devez faire vous-même pour wx.ListCtrl et je ne suis pas sûr que ce serait facile (ou élégant) à faire droit.

Pensez à utiliser un wx.Grid, voici un petit exemple pour vous aller:

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

Autres conseils

En plus de jakepars réponse: cela devrait vérifier, si l'en-tête est plus grand, ou l'élément qui prend le plus d'espace dans la colonne. Sans élégant mais travailler ...

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

Si vous souhaitez vous épargner beaucoup de maux de tête liés à wx.ListCtrl vous devez passer à l'aide de ObjectListView (a un livre de cuisine agréable et forum pour des exemples de code). Il est très agréable et j'ai tendance à l'utiliser pour quoi que ce soit plus d'un ListCtrl très basique, car il est extrêmement puissant et flexible et facile à coder. Voici la page wxPyWiki qui s'y rapporte (y compris le code exemple). Le développeur est également sur la liste de diffusion wxPython afin que vous pouvez envoyer des questions.

Cela fonctionne pour moi

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top