天天看點

wxpython wx listctrl_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列變成不可編輯