wxPython:VirtualTreeListCtrl,包含数百万项

wxPython:VirtualTreeListCtrl,包含数百万项,python,wxpython,virtual,listctrl,treecontrol,Python,Wxpython,Virtual,Listctrl,Treecontrol,我想向TreeListCtrl的根节点添加1000000多个条目。因此,我想让它成为虚拟的,也就是说,就像一个虚拟的ListCtrl一样工作,这样它仍然很快,我可以轻松地滚动,因为当前显示的项目是按需加载的。但我不能使用虚拟ListCtrl,因为我还希望能够展开1000000个项目中的任何一个以显示其子项。这些项目的子项将始终少于50个。使用TreeListCtrl可以有效地实现这一点吗?还是换个班?根据我自己对treemixin.VirtualTree和wx.gizmos.TreeListCt

我想向TreeListCtrl的根节点添加1000000多个条目。因此,我想让它成为虚拟的,也就是说,就像一个虚拟的ListCtrl一样工作,这样它仍然很快,我可以轻松地滚动,因为当前显示的项目是按需加载的。但我不能使用虚拟ListCtrl,因为我还希望能够展开1000000个项目中的任何一个以显示其子项。这些项目的子项将始终少于50个。使用TreeListCtrl可以有效地实现这一点吗?还是换个班?根据我自己对treemixin.VirtualTree和wx.gizmos.TreeListCtrl的实验,重载OnGetItemText方法的工作方式与对普通虚拟ListCtrl的工作方式不同。当用户滚动时,它不会被按需调用,这意味着所有1000000项都必须提前添加到TreeListCtrl中。

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

您是对的,treemixin没有使TreeListCtrl真正虚拟化。我在开发treemixin时考虑过这一点,但有一件事我不知道如何解决,那就是当用户查看树深处的项目(例如10000到10030)时,如何知道在项目左侧绘制哪些线。如果你知道解决这个问题的办法,我很乐意采用treemixin

坦率的


作者treemixin

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

感谢创建treemixin!但我不明白你说的绘画是什么意思。这纯粹是一个图形问题,还是底层数据结构中缺少信息的问题?你只需要知道一个节点有多少层深,对吗?不,只需要在随机工具中创建一个复杂的树,然后查看随机项左侧的垂直线。看到并想象一下,您只需向受保护的用户抽取成员即可。左边的行取决于这些项上下的树的结构。如果每个节点没有很多子节点,这将有所帮助。但是我的根节点有100万个子节点,也就是说,树的第二层有100万个节点,而这100万个节点中的每个节点最多有50个子节点。花时间向一个节点添加100万个子节点太慢了。请原谅任何混淆,但我的印象是,您可以使用虚拟树控件绘制100万个子节点,但不能绘制它们的子节点。因此,我的建议是对根的子节点使用虚拟树控件,然后拦截这些百万个子节点上的展开节点事件以添加子节点。