Как я могу получить ширину wx.ListCtrl и имя его столбца?

StackOverflow https://stackoverflow.com/questions/722298

Вопрос

Я работаю в 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, вам следует переключиться на использование ОбъектСписокView (есть хорошая кулинарная книга и форум для примеров кода).Это очень удобно, и я склонен использовать его не только для простого 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