我在wx.Python中工作,我想让我的wx.ListCtrl的列自动调整大小,即至少为列名的宽度,否则与最宽元素或其列名一样宽。起初我以为ListCtrlAutoWidthMixin可能会这样做,但它不会这样看起来我可能必须自己做(请纠正我,如果有一个内置的方式这样做!!!)
如何找出列表的标题和元素的宽度?
答案 0 :(得分:4)
除了jakepars之外,还应回答:这应该检查标题是否更大,还是列中占用空间最多的项目。不是优雅而是工作......
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()
答案 1 :(得分:3)
如果你想节省很多与wx.ListCtrl相关的头痛,你应该切换到使用ObjectListView(有一个很好的食谱和论坛代码示例)。它非常好用,我倾向于将它用于非常基本的ListCtrl,因为它非常强大,灵活且易于编码。这是the wxPyWiki page与之相关的(包括示例代码)。开发人员也在wxPython邮件列表中,因此您可以通过电子邮件发送问题。
答案 2 :(得分:2)
是的,你必须自己为wx.ListCtrl制作这个,我不确定这样做是否容易(或优雅)。
考虑使用wx.Grid,这是一个小例子让你前进:
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()
答案 3 :(得分:1)
这对我有用
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()