我在wx.Python工作,我想我的wx.ListCtrl到的列自动调整,即是在最小的列名的宽度,否则一样宽最宽的元素或它的列名。起初我以为ListCtrlAutoWidthMixin可能做到这一点,但它不那么它看起来像我可能会做我自己(请纠正我,如果有一个建在这样的方式!)

我怎样才能找出标题和我的列表的元素有多宽将呈现?

有帮助吗?

解决方案

是的,你将不得不作出这个自己的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()

其他提示

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

如果你想给自己节省了大量的头痛与wx.ListCtrl的,你应该切换到使用的 ObjectListView (有一个很好的食谱和论坛,代码示例)。这是非常好的,我倾向于将其用于任何超过一个非常基本的ListCtrl,因为它是非常强大的,灵活的,易于编写的。这里是的wxPyWiki页面与之相关的(包括示例代码)。开发商是wxPython的邮件列表上也这样你就可以带着问题通过电子邮件。

这对我的作品

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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top