2010-06-19 1 views
0

Я хотел бы добавить 1,000,000+ записей в корневой узел TreeListCtrl. Поэтому я хотел бы сделать его «виртуальным», т. Е. Работать так же, как виртуальный ListCtrl, чтобы он все еще был быстрым, и я могу легко прокручивать его из-за того, что отображаемые в данный момент элементы загружаются по требованию. Но я не могу использовать виртуальный ListCtrl, потому что я также хочу расширить любое из 1,000,000 предметов, чтобы отображать его дочерние элементы (в элементах всегда будет меньше 50 детей). Это можно сделать эффективно с помощью TreeListCtrl? Или с другим классом? Из моих собственных экспериментов с treemixin.VirtualTree и wx.gizmos.TreeListCtrl перегрузка метода OnGetItemText работает не так, как с простым виртуальным ListCtrl. Он не получает запрос по требованию, когда пользователь прокручивается, то есть все 1000 000 элементов должны быть добавлены в TreeListCtrl заранее.wxPython: VirtualTreeListCtrl с миллионами элементов

ответ

0

Одна вещь, которую вы могли бы сделать, - опустить узлы в узлах и захватить событие expand-node. Затем вы проверяете, заполнены ли узлы узла. Если они нет, вы добавляете их перед расширением узла. Если они заполнены, вы просто игнорируете событие.

+0

Это поможет, если на узел не так много узлов. Но в моем корневом узле подключено 1 миллион детей (т. Е. Во втором слое дерева есть 1 миллион узлов), а затем каждый из этих 1 миллионов человек имеет до 50 детей. Взять время, чтобы добавить 1 миллион суб-узлов к узлу слишком медленно. – Darryl

+0

Простите любую путаницу, но у меня создалось впечатление, что вы можете использовать элемент управления виртуального дерева, чтобы нарисовать миллион подэлементов, но не их детей. Поэтому мое предложение состояло в том, чтобы использовать элемент управления виртуальным деревом для дочерних элементов корня, а затем перехватить события расширения узла для этих миллионов детей, чтобы добавить узлы. –

0

Вы правы, что treemixin не делает TreeListCtrl действительно виртуальным. Я думал об этом, когда я разрабатывал treemixin, но единственное, что я не знал, как решить, - это узнать, какие строки следует рисовать слева от элементов, когда пользователь смотрит на предметы, расположенные глубоко вниз по дереву, например. От 10000 до 10030. Если вы знаете решение для этого, я с удовольствием адаптирую treemixin.

Frank

Автор treemixin

+0

Спасибо за создание treemixin! Но я не понимаю, что вы имеете в виду. Это чисто графическая проблема, или это проблема с отсутствующей информацией в базовой структуре данных? Вам просто нужно знать, сколько слоев в глубине узла, не так ли? – Darryl

+0

Нет, просто создайте сложное дерево в случайном инструменте и посмотрите на вертикальные линии слева от случайного элемента. См. Http://www.sapdesignguild.org/community/IMAGES/explorer_tree.gif и представьте, что вам нужно только нарисовать «членство» в «защищенном». Линии слева зависят от структуры дерева над и под этими элементами. –

0

Я думаю, что я буду делать, это использовать виртуальный ListCtrl вместе с пропуском-лист для модели данных. Первоначально модель данных будет содержать 1 миллион узлов верхнего уровня. Когда узел расширяется, я могу вставлять его дочерние элементы в skip-list в log time (намного лучше, чем линейное время для массива). Я буду указывать имена детей в ListCtrl, чтобы вы могли визуально определить, кто их родитель. Я думаю, что время поиска журнала для skip-list (в отличие от момента мгновенного произвольного доступа для массива) будет достаточно быстрым, чтобы обрабатывать прокрутку пользователя. Если у кого-то есть лучшее предложение, пожалуйста, дайте мне знать. В будущем я расскажу о том, работает ли моя идея или нет.

Смежные вопросы