wxPython: 虚拟树列表控件与数百万条目

0 投票
3 回答
817 浏览
提问于 2025-04-16 00:10

我想在一个TreeListCtrl的根节点上添加超过1,000,000个条目。为此,我希望它能像一个虚拟的ListCtrl一样工作,这样可以保持快速,并且我可以轻松滚动,因为当前显示的项目是按需加载的。不过,我不能使用虚拟的ListCtrl,因为我还想能够展开这1,000,000个条目中的任何一个,以显示它的子项(每个条目最多会有50个子项)。这样做能否在TreeListCtrl中高效实现?或者用其他的类可以吗?根据我自己对treemixin.VirtualTree和wx.gizmos.TreeListCtrl的实验,重载OnGetItemText方法的效果和普通的虚拟ListCtrl不一样。它不会在用户滚动时按需调用,这意味着所有1,000,000个条目必须提前添加到TreeListCtrl中。

3 个回答

0

我打算使用一个虚拟的列表控件(ListCtrl)和一个跳表(skip-list)来处理数据。最开始,数据模型里会有100万个顶层节点。当你展开一个节点时,我可以在跳表里快速插入它的子节点,这样的速度是对比数组的线性插入要快得多。为了让你能一眼看出子节点的父节点是谁,我会在列表中把子节点的名字缩进。虽然跳表的查找速度比数组的随机访问慢,但我觉得对于用户滚动来说,跳表的速度还是够快的。如果有人有更好的建议,请告诉我。我会在未来更新我的想法是否有效。

0

你说得对,treemixin并没有让TreeListCtrl真正变得虚拟。我在开发treemixin的时候也考虑过这个问题,但我不知道怎么解决一个难题,那就是当用户查看树结构中很深的项目时,比如从10000到10030,怎么知道应该在这些项目的左边画哪些线。如果你知道这个问题的解决办法,我会很乐意调整treemixin。

Frank

treemixin的作者

0

你可以这样做:把子节点留空,然后监听展开节点的事件。接着,你检查一下这个节点的子节点是否已经有内容。如果没有,你就在展开这个节点之前添加内容。如果子节点已经有内容了,那就直接忽略这个事件。

撰写回答