2012-07-03 11 views
11

Mam trzy kolumny w moim wx.ListCtrl(size=(-1,200)). Chciałbym, aby kolumny wypełniły szerokość listy ListCtrl po jej utworzeniu. W idealnej sytuacji pierwsza kolumna może się rozwinąć, aby wypełnić dodatkową dostępną przestrzeń. Druga i trzecia kolumna nie muszą się rozszerzać, a najlepiej nie zmieniają szerokości (formatowanie ocd).Utwórz szerokość kolumny zajmującą wolne miejsce w wxPython ListCtrl

Obecnie każda kolumna ListCtrl jest konfigurowana za pomocą (width=-1).

Mam wrażenie, mogę skorzystać z tej części kodu na moją korzyść ...

# Expand first column to fit longest entry item 
list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE) 

Pseudo-kod (chyba):

# After wx.ListCtrl creation 
Get width of ListCtrl control 
Get width of each ListCtrl column 
Calculate unused width of ListCtrl 
Set first column width to original width + unused width 

Dodano:

Zważywszy w poniższym przykładzie, nie rozumiem, jak zainicjować autowidmixin. Obecnie próbuję umieścić listctrl w foldpanelu. Foldpanel jest klasą, a funkcja w klasie tworzy listę znaków. Nie jestem nawet pewien, czy da się to zrobić, biorąc pod uwagę strukturę mojego kodu w tej chwili!

class MyPanel(wx.Panel): 

    def __init__(self, parent, dictionary): 
     self.dictionary = dictionary 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 

     # Layout helpers (sizers) and content creation (setPanel) 
     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(self.mainSizer) 
     list_ctrl = self.setPanel() 
     self.mainSizer.Add(list_ctrl, 0, wx.ALL | wx.EXPAND, 5) 
     self.GetSizer().SetSizeHints(self) 

    def setPanel(self): 
     index = 0 

     list_ctrl = wx.ListCtrl(self, size=(-1, 200), 
           style=wx.LC_REPORT | wx.BORDER_SUNKEN) 

     list_ctrl.InsertColumn(0, "Variable", format=wx.LIST_FORMAT_LEFT, width=-1) 
     list_ctrl.InsertColumn(1, "x", format=wx.LIST_FORMAT_RIGHT, width=-1) 
     list_ctrl.InsertColumn(2, u"\u03D0", format=wx.LIST_FORMAT_RIGHT, width=-1) 

     for key, value in self.dictionary.iteritems(): 
      list_ctrl.InsertStringItem(index, str(key)) 
      list_ctrl.SetStringItem(index, 1, ("%.2f" % value[0])) 
      list_ctrl.SetStringItem(index, 2, ("%.8f" % value[1])) 
      index += 1 

     list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE) 
     list_ctrl.SetColumnWidth(1, wx.LIST_AUTOSIZE) 
     list_ctrl.SetColumnWidth(2, wx.LIST_AUTOSIZE) 

     return list_ctrl 

Odpowiedz

13

Należy użyć klasy mixin ListCtrlAutoWidthMixin. Aplikacja demo wxPython ma przykład w demo ListCtrl. Zgodnie z documentation, możesz użyć jego metody setResizeColumn, aby określić, którą kolumnę zmienić. Wartością domyślną jest ostatnia kolumna.

EDYCJA (07/05/2012): W swoim kodzie utwórz klasę ListCtrl podobną do tej w wersji demonstracyjnej. Byłoby to wyglądać mniej więcej tak:

class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin): 
    def __init__(self, parent, ID, pos=wx.DefaultPosition, 
       size=wx.DefaultSize, style=0): 
     wx.ListCtrl.__init__(self, parent, ID, pos, size, style) 
     listmix.ListCtrlAutoWidthMixin.__init__(self) 
     self.setResizeColumn(0) 

Wtedy, kiedy jego instancję, można po prostu zadzwonić list_ctrl = TestListCtrl (arg1, arg2 ... argN)

pamiętać, że zawarte wezwanie do setResizeColumn () w moim kodzie powyżej. To nie jest testowane, ale powinno działać.

+0

Dodano dodatkowe informacje i fragment kodu. Nie mogę wymyślić, jak używać klasy mixin, biorąc pod uwagę układ mojego kodu atm. –