排序后如何删​​除wxListCtrl中的特定行?

时间:2013-08-15 05:31:16

标签: python user-interface wxpython listctrl

我在我的应用中使用wx.ListCtrl进行实时报告,并且会有持续状态更新,包括在任务开始时插入新行并在任务结束时删除相关行。由于列表不时被排序,因此您不能简单地按开头的rowid删除行。虽然您可以使用SetItemData分配唯一ID,并且这样您就可以确切知道在完成任务时要删除哪一行,但 NOT 似乎是与删除行相关的任何方法通过该唯一ID,甚至不是通过唯一ID获取rowid的方法,并且我找到的唯一方法是GetItemData,它将返回特定行的唯一ID。

所以我想到的唯一方法是迭代所有行检查它们的唯一id并将它与给定的id进行比较,如果它匹配则删除该行。但这听起来太笨拙了,那么排序后是否有更好的方法来删除特定的行?

2 个答案:

答案 0 :(得分:0)

如果 你可以将你的wxPython升级到2.9.x系列然后有一个简单的答案 - 使用DataViewListCtrl - 因为显示器反映了你的数据而不是实际包含数据。因此,如果您的数据模型由于数据项(行)而发生更改而被删除,那么无论显示如何排序,您的显示都将松开该行。如果你不能,那么我怀疑你必须标记具有唯一ID的行,然后找到它们进行删除。

如果您需要执行后者,我建议您使用一个可能隐藏的RowID列,其中包含您的唯一ID,以及您使用子流程PID作为键维护的字典以及作为值的唯一ID或作为值的函数将进程ID映射到唯一的行ID。

显然在流程创建上添加新行不是问题,只需记住包含您的唯一ID即可。当您的流程结束时获取行ID并执行以下操作:

def FindRow(ID):
   """ Find the row that matches the ID """
   match = None
   for index in range(self.TheGrid.GetNumberRows()):
      if self.TheGrid.GetCellValue(index, IdColNo):
         match = index
         break
   return match

       # In your process end handler
       Line = FindRow(GetID(pid))
       if (Line): 
            self.TheGrid.DeleteRows(Line, 1)

答案 1 :(得分:0)

我最终使用ObjectListView来完成这项工作。基本上,您为列表中的对象构建索引,然后您就可以在任何所需的行上操作。它比wx.ListCtrl

更方便