2016-03-30 1 views
4

Je suis en train de développer une boîte de dialogue graphique utilisant PyQT4 qui importe des données dans un Pandas DataFrame, puis trace les données dans un canevas Matplotlib incorporé.Remplir QComboBox avec une liste

Je voudrais passer une liste de variable de la DataFrame à la zone de liste déroulante. Ma première tentative a été:

list = list(df.parameter,unique()) 
self.FirstComboBox = QtGui.QComboBox() 
self.FirstComboBox.addItems(list) 

Mais l'exécution de ce je reçois

TypeError: QComboBox.addItems(QStringList): argument 1 has unexpected type 'list' 

J'ai vu des exemples où une liste triée des clés dict est passé à une zone de liste déroulante, donc je suis confus que Je ne peux pas passer une liste.

Ben

Répondre

1

Il semble que vous utilisez l'ancienne v1 api. Vous pouvez utiliser le newer api, ce qui supprime le besoin de lancer des chaînes à QStrings (ou QStringLists dans ce cas).

import sip 
# Do this before you import PyQt 
sip.setapi('QString', 2) 

from PyQt4 import QtCore 
1

En fin de compte, j'ai eu ce travail. Mais je ne suis pas content avec ça.

 for i in range(len(channels)): 
      self.MyComboBox.addItem(channels[i]) 
+0

En Python, ce type d'itération explicite se réduit trivialement à: 'pour un canal dans les canaux: self.MyComboBox.addItem (channel)'. PySide2 semble malheureusement nécessiter un contournement similaire. En particulier, le '' TypeError: 'PySide2.QtWidgets.QComboBox.addItems' appelé avec des types d'arguments erronés "' exception est levée lors de la tentative de passer une chaîne de chaînes pure-Python à la méthode * any * 'addItems()' - une échec flagrant du générateur de liaison sous-jacent (par exemple, SIP, Shiboken2). '' –

+0

** Oh, je vois. ** Dans mon cas, j'essayais de passer une vue des valeurs 'OrderedDict' (c'est-à-dire la séquence retournée par la méthode' OrderedDict.values ​​() ')' 'QComboBox .addItems() 'méthode. Puisque cette vue * est * une séquence valide, cela devrait techniquement fonctionner. Ce n'est pas le cas, car le générateur de liaison semble ne supporter que les séquences 'tuple' et' list'. Dans mon cas, la solution consistait donc à forcer la séquence désirée en un «tuple» d'abord: par exemple, 'self.MyComboBox.addItems (tuple (channels))'. –