【问题标题】:How to delete a specific row in wxListCtrl after sorting?排序后如何删​​除wxListCtrl中的特定行?
【发布时间】:2013-08-15 05:31:15
【问题描述】:

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

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

【问题讨论】:

    标签: python user-interface wxpython listctrl


    【解决方案1】:

    如果您可以将 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)
    

    【讨论】:

    • 整个应用程序是用 2.8 编写的,但我想我以后可以试试 2.9。尽管如此,让我感到失望的是,您可以使用唯一 ID 标记一行,但您不能稍后使用唯一 ID 找到该行。
    • @Shane 你当然可以——这完全取决于你,但还不错——查看修改后的答案。
    • 谢谢伙计!我的意思是,您仍然必须编写自己的方法来迭代整个列表以搜索匹配的索引,想象一个包含数千行的不断更新的列表,仅搜索行索引本身就会有太多的开销,如果列表更新非常频繁,它可能会时不时地阻塞 GUI,这使得 UI 体验不那么愉快。我只是想知道为什么唯一id和行索引之间没有映射机制,而且我没有看到提供部分有用的“唯一id”的意义,创作者一开始不应该意识到这一点吗?
    【解决方案2】:

    我最终使用ObjectListView 来完成这项工作。基本上你在列表中为你的对象建立一个索引,然后你就可以对任何你想要的行进行操作。比wx.ListCtrl方便多了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2016-01-21
      相关资源
      最近更新 更多