Domanda

sto lavorando in wx.Python e voglio ottenere le colonne della mia wx.ListCtrl il ridimensionamento automatico cioè di essere al minimo la larghezza del nome della colonna e altrimenti larga quanto l'elemento più largo o il suo nome di colonna . In un primo momento ho pensato che la ListCtrlAutoWidthMixin potrebbe fare questo, ma non lo fa così sembra che avrei potuto farlo io stesso (Si prega di correggere se c'è una costruito nel modo di fare questo !!!)

Come faccio a trovare il modo di larghezza saranno resi i titoli e gli elementi della mia lista?

È stato utile?

Soluzione

Sì, si dovrebbe fare da soli per wx.ListCtrl e non sono sicuro che sarebbe stato facile (o elegante) a fare il bene.

è consigliabile utilizzare un wx.Grid, ecco un piccolo esempio per farti andare:

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

Altri suggerimenti

Oltre a jakepars Risposta: Questo dovrebbe controllare, se l'intestazione è più grande, o la voce che prende più spazio nella colonna. Non elegante, ma lavorare ...

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

Se vuoi per risparmiare un sacco di mal di testa legati a wx.ListCtrl si dovrebbe passare ad utilizzare ObjectListView (ha un bel libro di cucina e forum per gli esempi di codice). E 'molto bello e tendo a usarlo per qualcosa di più di un ListCtrl molto semplice, perché è estremamente potente e flessibile e facile da codificare fino. Ecco pagina wxPyWiki ad esso correlati (tra cui esempio di codice). Lo sviluppatore è anche sulla mailing list wxPython in modo da poter e-mail con le domande.

Questo funziona per me

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top