wxPython实现指定单元格可编辑的ListCtrl

我们知道在wxPython中,可编辑的列表控件可以通过同时集成wx.lib.mixins.listctrl.TextEditMixin和wx.ListCtrl来实现,但仅此还不够,我们有时还需要特定的列是可编辑的,其余的列不可编辑,下面是我的实现方法,如果大家有更好的,欢迎大家一起讨论。 
class EditAbleListCtrl(wx.ListCtrl, listmix.TextEditMixin):
    ''' 可编辑的列表控件
    @note: 使用方式(定义,添加列,插入行数据等)与wx.ListCtrl一样,需要指定x行y列的单元格可编辑方法为:ins.appendCanEditItem(y,x)
    '''
    def __init__(self,parent,id,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT):
        wx.ListCtrl.__init__(self, parent, id, pos, size, style)
        listmix.TextEditMixin.__init__(self)
        self.__canEditList = []      # 可编辑项目列表
        
    def OpenEditor(self, col, row):
        ''' 控制当前项目能否编辑 '''
        if self.canEdit(col, row):
            listmix.TextEditMixin.OpenEditor(self, col, row)
        else:
            pass

    def setCanEditList(self,canEditList):
        ''' 设置某行某列为可编辑 
        @param editFlagList: @type list: 单个元素是元组类型,参照 self.__canEditList 的说明,
        '''
        self.__canEditList = canEditList
        
    def appendCanEditItem(self,col,row):
        ''' 将指定的项目添加到可编辑列表中 '''
        if (col,row) not in self.__canEditList:
            self.__canEditList.append((col,row))
        else:
            pass
        
    def removeCanEditItem(self,col,row):
        ''' 将指定项目从可编辑列表中移除,使其不可编辑 '''
        if (col,row) in self.__canEditList:
            self.__canEditList.remove((col,row))
        else:
            pass
    
    def removeAllCanEditItem(self):
        self.__canEditList = []
        
    def canEdit(self,col,row):
        ''' 判断当前点击的项目是否可编辑 '''
        if (col,row) in self.__canEditList:
            return True
        else:
            return False
    def currentCanEditItem(self):
        ''' 返回当前可编辑项目的列表'''
        return self.__canEditList

下面是具体的定义方法:
self.editableListCtrlTestCaseInfo = EditAbleListCtrl(self.panelTestRecipients,wx.ID_ANY,style=wx.LC_REPORT|wx.LC_ALIGN_LEFT|wx.LC_SORT_ASCENDING)
self.editableListCtrlTestCaseInfo.InsertColumn(0,OpmexConstant.LIST_ITEM_NAME_NO,width=50)
self.editableListCtrlTestCaseInfo.InsertColumn(1,OpmexConstant.LIST_ITEM_NAME_TEAM,width=60)
self.editableListCtrlTestCaseInfo.InsertColumn(2,OpmexConstant.LIST_ITEM_NAME_NAME,width=100)
self.editableListCtrlTestCaseInfo.InsertColumn(3,OpmexConstant.LIST_ITEM_NAME_EMAIL,width=200)
下面是更新可编辑列表数据及控制指定列可编辑的例子:
def updateTestCase(self):
        ''' 将实时数据更新到列表控件中去 '''
        if self.editableListCtrlTestCaseInfo.GetItemCount() > 0:
            self.editableListCtrlTestCaseInfo.DeleteAllItems()
        self.lineNo = 0
        tcCount = len(self.__testCaseList)
        i = 0
        while i < tcCount:
            if not self.__commandSet.has_key(self.__testCaseList[i]['commandCode']):
                self.__testCaseList.remove(self.__testCaseList[i])
                continue
            item = wx.ListItem()
            self.editableListCtrlTestCaseInfo.InsertItem(item)
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,0,unicode(self.lineNo+1))
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,1,unicode(self.__commandSet[self.__testCaseList[i]['commandCode']]['commandDescription']))
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,2,unicode(self.__testCaseList[i]['ip']))
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,3,unicode(self.__testCaseList[i]['timeout']))
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,4,unicode(self.__testCaseList[i]['executeTime']))
            self.editableListCtrlTestCaseInfo.SetStringItem(self.lineNo,5,unicode(json.dumps(self.__testCaseList[i]['parameter'])))
            self.editableListCtrlTestCaseInfo.appendCanEditItem(2,self.lineNo)# 设定self.lineNo行2列可编辑
            self.editableListCtrlTestCaseInfo.appendCanEditItem(3,self.lineNo)
            self.editableListCtrlTestCaseInfo.appendCanEditItem(4,self.lineNo)
            if self.__testCaseList[i]['parameter'] != None:
                self.editableListCtrlTestCaseInfo.appendCanEditItem(5, self.lineNo)
            self.lineNo += 1
            i += 1
        self.editableListCtrlTestCaseInfo.EnsureVisible(self.lineNo)
如果想改变主意,觉得某些原本可编辑的列现在不让编辑了可以使用:
removeAllCanEditItem()# 一次性使全部的可编辑单元格变成不可编辑
removeCanEditItem(col,row)# 使row行,col列变成不可编辑

你可能感兴趣的:(wxPython,可编辑ListCtrl)