wxPython listctrl:只允许对某些列进行排序

时间:2016-09-05 16:40:17

标签: python wxpython listctrl

我使用wx.ListCtrl显示了一个表格。我希望在单击列标题时可以对所有列进行排序,除了存储行索引的第一列(例如,0,1,2,3,...)。这意味着,如果用户单击第一列的标题,则不应对表进行排序。但ColumnSorterMixin似乎只允许我指定可排序列的数量。由于行id列是第一列,因此不允许我从其中一个可排序列中排除行id列。任何建议都将不胜感激!

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

1 个答案:

答案 0 :(得分:1)

我不知道是否有更好的处理方法。无论如何,以下是我的方法:

class MyColumnSorterMixin(listmix.ColumnSorterMixin):

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

请务必使用MyColumnSorterMixin

中的MyColumnSorterMixin.__init__(self, 4)新班级