Je voudrais ajouter 1 000 000+ entrées au nœud racine d'un TreeListCtrl. Par conséquent, je voudrais le rendre "virtuel", c'est-à-dire fonctionner comme un ListCtrl virtuel afin qu'il soit toujours rapide et que je puisse facilement me déplacer en raison des éléments actuellement chargés à la demande. Mais je ne peux pas utiliser un ListCtrl virtuel, car je veux aussi pouvoir développer n'importe lequel des 1 000 000 objets pour afficher ses enfants (les objets auront toujours moins de 50 enfants). Cela peut-il être fait efficacement avec un TreeListCtrl? Ou avec une classe différente? De mes propres expériences avec treemixin.VirtualTree et wx.gizmos.TreeListCtrl, surcharger la méthode OnGetItemText ne fonctionne pas de la même manière qu'avec un ListCtrl virtuel simple. Il n'est pas appelé à la demande lorsque l'utilisateur défile, ce qui signifie que tous les 1 000 000 éléments doivent être ajoutés au TreeListCtrl à l'avance.wxPython: VirtualTreeListCtrl avec des millions d'éléments
Répondre
Une chose que vous pourriez faire est de laisser les sous-nœuds vides, et attraper l'événement expand-node. Ensuite, vous vérifiez si les sous-nœuds du nœud sont remplis. Si ce n'est pas le cas, ajoutez-les avant d'agrandir le noeud. Si elles sont remplies, vous ignorez simplement l'événement.
Vous avez raison de dire que le treemixin ne rend pas vraiment le TreeListCtrl virtuel. J'y ai pensé quand je développais la treemixine, mais la seule chose que je ne savais pas comment résoudre était comment savoir quelles lignes dessiner à gauche des objets quand l'utilisateur regarde des objets au plus profond de l'arbre, par ex. 10000 à 10030. Si vous connaissez une solution pour cela, j'adapterai volontiers treemixin.
Frank
Auteur treemixin
Merci d'avoir créé treemixin! Mais je ne comprends pas ce que tu veux dire par le dessin. Est-ce purement un problème graphique, ou est-ce un problème avec des informations manquantes dans la structure de données sous-jacente? Vous auriez juste besoin de savoir combien de couches de profondeur un nœud est, non? – Darryl
Non, il suffit de créer une arborescence complexe dans un outil aléatoire et de regarder les lignes verticales à gauche d'un élément aléatoire. Voir http://www.sapdesignguild.org/community/IMAGES/explorer_tree.gif et imaginez que vous n'avez qu'à dessiner "membership" à "protected". Les lignes à gauche dépendent de la structure de l'arbre au-dessus et au-dessous de ces éléments. –
Je pense que je vais faire est d'utiliser un ListCtrl virtuel avec un saut-liste pour le modèle de données. Initialement, le modèle de données contiendra les 1 million de nœuds de couche supérieure. Quand un noeud est développé, je peux insérer ses enfants dans la liste de sauts dans le journal (beaucoup mieux que le temps linéaire pour un tableau). Je vais indenter les noms des enfants dans le ListCtrl afin que vous puissiez dire visuellement qui est leur parent. Je pense que le temps de recherche du journal pour la liste de sauts (par opposition au temps d'accès aléatoire instantané pour un tableau) sera assez rapide pour gérer le défilement de l'utilisateur. Si quelqu'un a une meilleure suggestion, s'il vous plaît faites le moi savoir. Je fournirai une mise à jour à l'avenir pour savoir si mon idée a fonctionné ou non.
Cela aiderait s'il n'y avait pas beaucoup de sous-nœuds par nœud. Mais mon nœud racine a 1 million d'enfants attachés (c'est-à-dire, il y a 1 million de nœuds dans la deuxième couche de l'arbre), et chacun de ces 1 million a jusqu'à 50 enfants. Prendre le temps d'ajouter 1 million de sous-nœuds à un nœud est trop lent. – Darryl
Pardonnez toute confusion, mais j'avais l'impression que vous pouviez utiliser le contrôle de l'arbre virtuel pour dessiner le million de sous-nœuds, mais pas leurs enfants. Donc, ma suggestion était d'utiliser le contrôle de l'arbre virtuel pour les enfants de la racine, puis d'intercepter les événements expand-node sur ces millions d'enfants pour ajouter les sous-nœuds. –