Pregunta

Estoy trabajando en wx.Python y quiero conseguir las columnas de mi wx.ListCtrl a cambio de tamaño es decir, ser como mínimo el ancho del nombre de la columna y de otra manera tan amplia como el elemento más amplia o su nombre de columna . Al principio pensé que el ListCtrlAutoWidthMixin podría hacer esto, pero no lo hace así que parece que voy a tener que hacerlo yo mismo (por favor, corríjanme si hay una construida en la forma de hacer esto !!!)

¿Cómo puedo encontrar la manera de ancho serán prestados los títulos y los elementos de mi lista?

¿Fue útil?

Solución

Sí, usted tendría que hacer esto por sí mismo para wx.ListCtrl y no estoy seguro de que sería fácil (o elegante) para hacer lo correcto.

Considere el uso de un wx.Grid, aquí es un pequeño ejemplo para que te va:

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

Otros consejos

Además de jakepars respuesta: esto debe comprobar, si la cabecera es más grande, o el elemento que tiene el mayor espacio en la columna. No elegante pero trabajando ...

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 desea ahorrarse muchos dolores de cabeza relacionados con wx.ListCtrl usted debe cambiar a usar ObjectListView (tiene un buen libro de cocina y un foro para ejemplos de código). Es muy agradable y que tienden a usarlo para algo más que un ListCtrl muy básico, ya que es extremadamente potente y flexible y fácil de codificar hasta. Aquí es la página wxPyWiki relacionado con él (incluyendo código de ejemplo). El desarrollador también está en la lista de correo para que pueda wxPython correo electrónico con preguntas.

Esto funciona para mí

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top