wxPython:包含数百万项的VirtualTreeListCtrl

时间:2010-06-19 03:15:02

标签: python wxpython virtual listctrl treecontrol

我想将1,000,000多个条目添加到TreeListCtrl的根节点。因此我想把它变成“虚拟”,即像虚拟ListCtrl一样工作,这样它仍然很快,我可以轻松滚动,因为当前显示的项目是按需加载的。但我不能使用虚拟ListCtrl,因为我还希望能够扩展1,000,000个项目中的任何一个以显示其子项(项目总是少于50个子项)。使用TreeListCtrl可以有效地完成吗?还是有不同的课程?根据我自己使用treemixin.VirtualTree和wx.gizmos.TreeListCtrl的实验,重载OnGetItemText方法的方式与使用普通虚拟ListCtrl的方式不同。当用户滚动时,它不会按需调用,这意味着必须提前将所有1,000,000个项目添加到TreeListCtrl中。

3 个答案:

答案 0 :(得分:0)

您可能要做的一件事是将子节点留空,并捕获expand-node事件。然后检查节点的子节点是否已填充。如果不是,则在展开节点之前添加它们。如果填充它们,您只需忽略该事件。

答案 1 :(得分:0)

你是对的,treemixin不会使TreeListCtrl真正虚拟。当我开发treemixin时,我想到了这一点,但我不知道如何解决的一件事是当用户正在查看树深处的项目时,如何知道要在项目左侧绘制哪些行,例如10000到10030.如果您知道解决方案,我很乐意适应treemixin。

作者treemixin

答案 2 :(得分:0)

我认为我要做的是使用虚拟ListCtrl和数据模型的跳过列表。最初,数据模型将包含100万个顶层节点。展开节点时,我可以在日志时间内将其子项插入跳过列表(比数组的线性时间好得多)。我将在ListCtrl中缩进子项的名称,以便您可以直观地告诉他们的父级是谁。我认为跳过列表的日志搜索时间(与数组的即时随机访问时间相反)将足够快以处理用户的滚动。如果有人有更好的建议,请告诉我。我将在未来提供有关我的想法是否有效的更新。