【问题标题】:Calling DeleteAllItems method on wx.TreeCtrl object takes a very long time在 wx.TreeCtrl 对象上调用 DeleteAllItems 方法需要很长时间
【发布时间】:2018-07-23 18:42:16
【问题描述】:

我编写了一个小应用程序,用于从数据集中解析数据,并将其显示在 wx 视觉文件中,并带有几个不同的文件。显示的元素都在不同页面上的一个笔记本对象中。一些是 wx.TextCtrl/wx.StyledTextCtrl 对象,其他的是 wx.TreeCtrl 对象。

一个特定的 wx.TreeCtrl 对象填充了超过 2000 个分支。

创建树并填充它:

data_tree = wx.TreeCtrl(data_page, style=wx.TR_HAS_BUTTONS | wx.TR_HAS_VARIABLE_ROW_HEIGHT)
data_to_parse = utils.getData()  # This returns a list of objects with data string
root = data_tree.GetRootItem()

for entry in data_to_parse:
    # The method (utils.isMatch())is used to verify contents in the string. 
    # If there is a match the string is used to create a tree entry.
    if utils.isMatch(entry.data):  
        data_tree.AppendItem(root, text=entry.data)

调用 DeleteAllItems() 方法时:

data_tree.DeleteAllItems()

我注意到当应用程序在这个特定的树上调用 DeleteAllItems() 方法时,在方法返回之前有很长的等待时间(5-10 秒)。这会导致在填充树时关闭应用程序的时间很长。由于此工具用于动态评估数据集的问题,因此必须使该工具在必要时快速打开/关闭。

我的问题是关于 wx.TreeCtrl 对象上 DeleteAllItems 的性能。这是释放这些资源的唯一方法吗?有没有更省时的替代方案?

我知道可能会建议减少树中主动加载的元素的数量,但这并不可取,因为消费者使用此树中的完整数据集来了解事件流以及每个事件中的数据.

【问题讨论】:

  • 你能显示一些代码吗?具体来说,如何创建树控件。

标签: python-2.7 wxpython wxwidgets


【解决方案1】:

目前尚不清楚您为什么要花这么长时间。 2000 个分支很多,可以说超过了合理的上限(如果您需要很多项目,请考虑使用 wxDataViewCtrl),但删除它们仍然不应该花费 10 秒。

您的代码中是否有任何wxEVT_TREE_DELETE_ITEM 处理程序?它们将为每个要删除的项目执行,因此如果您这样做,请确保在删除树之前取消绑定它们。

【讨论】:

    【解决方案2】:

    我找到了解决方法。

    调用 os.kill(os.getpid(), signal.SIGTERM) 可以让我的应用程序快速退出,并由 Windows 处理内存清理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2013-09-07
      • 2020-08-26
      相关资源
      最近更新 更多