2010-12-13 64 views
2

J'ai une liste d'objets Vertex, chacun avec ses propres étiquettes et identifiants. Comment puis-je utiliser cette liste comme modèle pour un ComboBox wxPython de sorte que lorsqu'un utilisateur sélectionne une option, je peux immédiatement récupérer l'identifiant Vertex?Comment puis-je stocker des objets autres que des chaînes dans un ComboBox wxPython?

Il semble que ComboBox accepte uniquement les chaînes en tant que modèle. Je ne peux pas créer un dictionnaire de paires label à id car il y a des labels en double.

J'ai remarqué une classe ComboCtrl que je peux sous-classer pour créer une zone de liste déroulante spécialisée, mais j'ai l'impression qu'il existe une solution plus simple.

+0

Que diriez-vous de 'labels + id'? – katrielalex

+0

Cela fonctionnerait. Je pourrais créer un dictionnaire qui mappe les étiquettes + id aux id, ou extraire la dernière partie de la chaîne et la convertir en identification. Pourtant, je me demande s'il y a un moyen facile de simplement stocker des objets. Merci. – bgoosman

Répondre

5

Ce sujet est venu sur le canal IRC wxPython plus tôt aujourd'hui, mais en ce qui concerne la zone de liste. Heureusement, les deux widgets héritent de wx.ItemContainer, afin que vous puissiez effectuer les opérations suivantes:

for item in ObjList: 
    self.myCboBox.append(item.label, item) 

Ensuite, dans le gestionnaire d'événements, vous feriez quelque chose comme:

itemObject = self.myCboBox.GetClientData(self.myCboBox.GetSelection()) 
itemID = itemObject.id 

Cela devrait fonctionner.

+0

Merci! Cela devrait bien fonctionner. – bgoosman

+0

Et ça marche bien. Marqué comme réponse correcte. – bgoosman

+0

Alors, comment définiriez-vous la sélection pour le wx.ComboBox étant donné le itemObject.id? – tponthieux

0

L'approche la plus simple consisterait à stocker des vertex dans une liste et à extraire la valeur sélectionnée par index (renvoyé par wx.ComboBox GetSelection()).

Edit: q & d exemple:

l = [{"value" : value_1, "label" : "label"}, 
    {"value" : value_2, "label" : "label"}] 

def on_select (event): 
    i = event.GetSelection() 
    print (l[i]["value"]) 

# ui construction omitted  

Bind (wx.EVT_COMBOBOX, on_slect) 
+0

C'est exactement ce que je fais, mais je préfère afficher l'étiquette vertex au lieu de l'id. – bgoosman

+0

@bgoosman: extrait d'exemple ajouté; l'idée est d'utiliser des clés "label" pour ui mais récupérer la valeur lors de la sélection (la liste des dictionnaires a été choisie arbitrairement, il pourrait s'agir d'une liste de tuples ou d'une liste de listes à la place). –

+0

Ok, donc l'idée est que nous utilisons le rang de chaque sommet dans le tableau pour créer un mappage un-à-un entre label et id? – bgoosman