2009-04-06 9 views
1

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

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

ответ

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

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

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() 
+0

Я думаю, что вы хотите wx.LIST_AUTOSIZE_USEHEADER - в противном случае он не принимает во внимание текст заголовка столбца, только текст значений данных. –

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