在wx.TreeCtrl对象上调用DeleteAllItems方法花费很长时间

时间:2018-07-23 18:42:16

标签: python-2.7 wxpython wxwidgets

我编写了一个小应用程序,用于解析数据集中的数据,并将其以wx visual的形式显示在多个不同的文件中。显示的元素都在单独页面上的一个笔记本对象中。一些是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的性能。这是释放这些资源的唯一方法吗?有更省时的选择吗?

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

2 个答案:

答案 0 :(得分:0)

目前尚不清楚为什么需要这么长时间。 2000个分支的数量很多,并且可以说是合理的上限(如果您确实需要很多项目,请考虑使用wxDataViewCtrl),但是删除它们仍然不需要10秒。

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

答案 1 :(得分:-1)

我能够找到解决方法。

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