wxPython: VirtualTreeListCtrl с миллионами элементов - PullRequest
0 голосов
/ 19 июня 2010

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

Ответы [ 3 ]

0 голосов
/ 19 июня 2010

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

Frank

Автор treemixin

0 голосов
/ 21 июня 2010

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

0 голосов
/ 19 июня 2010

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

...