2016-09-05 5 views
0

wx.ListCtrl을 사용하여 테이블을 표시했습니다. 행 색인 (예 : 0,1,2,3, ...)을 저장하는 첫 번째 열을 제외하고 열 머리글을 클릭하면 모든 열을 정렬 할 수 있기를 원합니다. 따라서 사용자가 첫 번째 열의 머리글을 클릭하면 표가 정렬되어서는 안됩니다. 하지만 ColumnSorterMixin은 정렬 할 수있는 열의 수를 지정하는 것으로 보입니다. 행 id 열이 첫 번째 열이므로, 정렬 가능한 행 중 하나에서 행 ID 열을 제외 할 수 없습니다. 어떤 제안이라도 대단히 감사 할 것입니다!wxPython listctrl : 일부 열에 대해서만 정렬 허용

import wx 
import wx.lib.mixins.listctrl as listmix 

musicdata = { 
0 : ("Bad English", "The Price Of Love", "Rock"), 
1 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"), 
2 : ("George Michael", "Praying For Time", "Rock"), 
3 : ("Gloria Estefan", "Here We Are", "Rock"), 
4 : ("Linda Ronstadt", "Don't Know Much", "Rock"), 
5 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"), 
6 : ("Paul Young", "Oh Girl", "Rock"), 
} 

######################################################################## 
class TestListCtrl(wx.ListCtrl): 

    #---------------------------------------------------------------------- 
    def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition, 
       size=wx.DefaultSize, style=0): 
     wx.ListCtrl.__init__(self, parent, ID, pos, size, style) 

######################################################################## 
class TestListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin): 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) 

     self.index = 0 

     self.list_ctrl = TestListCtrl(self, size=(-1,100), 
         style=wx.LC_REPORT 
         |wx.BORDER_SUNKEN 
         |wx.LC_SORT_ASCENDING 
         ) 
     self.list_ctrl.InsertColumn(0, "RowID") 
     self.list_ctrl.InsertColumn(1, "Artist") 
     self.list_ctrl.InsertColumn(2, "Title", wx.LIST_FORMAT_RIGHT) 
     self.list_ctrl.InsertColumn(3, "Genre") 

     items = musicdata.items() 
     self.itemDataMap = dict() 
     index = 0 
     for key, data in items: 
      self.list_ctrl.InsertStringItem(index, str(index+1)) 
      self.list_ctrl.SetStringItem(index, 1, data[0]) 
      self.list_ctrl.SetStringItem(index, 2, data[1]) 
      self.list_ctrl.SetStringItem(index, 3, data[2]) 
      self.list_ctrl.SetItemData(index, key) 
      self.itemDataMap[index] = (str(index), data[0], data[1], data[2]) 
      index += 1 

     # Now that the list exists we can init the other base class, 
     # see wx/lib/mixins/listctrl.py 
     #self.itemDataMap = musicdata 
     listmix.ColumnSorterMixin.__init__(self, 4) 
     self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list_ctrl) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     self.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py 
    def GetListCtrl(self): 
     return self.list_ctrl 

    #---------------------------------------------------------------------- 
    def OnColClick(self, event): 
     print "column clicked" 
     event.Skip() 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial") 

     # Add a panel so it looks the correct on all platforms 
     panel = TestListCtrlPanel(self) 

#---------------------------------------------------------------------- 
# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 
+0

MyColumnSorterMixin.__init__(self, 4) 같이됩니다 : 어쨌든, 다음은 나의 접근 방식인가? –

답변

1

더 좋은 방법이 있을지 모르겠다. 즉,

class MyColumnSorterMixin(listmix.ColumnSorterMixin): 

    def GetColumnSorter(self): 
     if self._col <> 0: 
      return listmix.ColumnSorterMixin.GetColumnSorter(self) 

새로운 클래스를 사용하는 것을 잊지 마십시오 당신은`마지막 열을 RowId` 것을 고려 적이 MyColumnSorterMixin

관련 문제