Como posso obter a largura de um wx.ListCtrl e seu nome da coluna?
Pergunta
Eu estou trabalhando em wx.Python e quero obter as colunas da minha wx.ListCtrl a auto-redimensionamento ou seja, estar no mínimo a largura do nome da coluna e de outra forma tão ampla como o maior elemento ou seu nome da coluna . No começo eu pensei que o ListCtrlAutoWidthMixin pode fazer isso, mas não por isso parece que eu poderia ter de fazer isso sozinho (Corrija-me se há um construído em forma de fazer isso !!!)
Como posso descobrir o quão grande os títulos e elementos da minha lista será processado?
Solução
Sim, você teria que fazer isso sozinho para wx.ListCtrl e eu não tenho certeza de que seria fácil (ou elegante) para fazer o certo.
Considere usar um wx.Grid, aqui está um pequeno exemplo para você ir:
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()
Outras dicas
Além de resposta jakepars: este deve verificar, se o cabeçalho é maior, ou o item que leva o maior espaço na coluna. Não elegante, mas funciona ...
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 você gostaria de salvar um monte de dor de cabeça relacionada com wx.ListCtrl você deve passar a usar ObjectListView (tem um bom livro de receitas e um fórum para exemplos de código). É muito bom e eu tendem a usá-lo para qualquer coisa mais do que um ListCtrl muito básica, porque é extremamente poderoso e flexível e fácil de código de cima. Aqui está página wxPyWiki relacionado a ele (incluindo exemplo de código). O desenvolvedor também está na lista wxPython para que você possa enviar e-mail com perguntas.
Isso funciona para mim
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()