¿Cómo puedo obtener el ancho de una wx.ListCtrl y su nombre de columna?
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?
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()