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

Я работаю в wx.Python и хочу, чтобы столбцы моего wx.ListCtrl автоматически меняли размеры, т.е. имели минимальную ширину имени столбца и, в остальном, ширину самого широкого элемента или его имени столбца. , Сначала я думал, что ListCtrlAutoWidthMixin мог бы сделать это, но это не так, похоже, мне, возможно, придется делать это самому (Пожалуйста, исправьте меня, если есть встроенный способ сделать это !!!)

Как узнать, насколько широко будут отображаться заголовки и элементы моего списка?

Ответы [ 4 ]

4 голосов
/ 18 апреля 2011

В дополнение к ответу 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()
3 голосов
/ 07 апреля 2009

Если вы хотите избавить себя от головной боли, связанной с wx.ListCtrl, вам следует переключиться на использование ObjectListView (имеет хорошую кулинарную книгу и форум для примеров кода). Это очень приятно, и я склонен использовать его для чего-то большего, чем очень простой ListCtrl, потому что он чрезвычайно мощный, гибкий и легко кодируемый. Вот страница wxPyWiki , связанная с ней (включая пример кода). Разработчик также включен в список рассылки wxPython, поэтому вы можете отправлять вопросы по электронной почте.

2 голосов
/ 06 апреля 2009

Да, вы должны были бы сделать это сами для 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()
1 голос
/ 01 февраля 2011

Это работает для меня

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()
...