#1 Mon 20 June 2016 09:33
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Plugin QGIS - Fonction non définie "global name..."
Version QGIS : 2.8.9 Wien
Version Python : 2.7
Version OS : Windows 10
Bonjour à tous,
Je fais appel à vous car j'ai un problème pour "initialiser" une fonction que j'ai créée dans mon plugin QGIS.
Le code de mon plugin prend la forme suivante :
Code:
class MonPlugin(QDialog): """QGIS Plugin Implementation.""" def __init__(self, iface): """Constructor. instance that will be passed to this class which provides the hook by which you can manipulate the QGIS application at run time. :type iface: QgsInterface """ # Save reference to the QGIS interface self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) # initialize locale locale = QSettings().value('locale/userLocale')[0:2] locale_path = os.path.join( self.plugin_dir, 'i18n', 'DistributionStrategy_{}.qm'.format(locale)) if os.path.exists(locale_path): self.translator = QTranslator() self.translator.load(locale_path) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) # Create the dialog (after translation) and keep reference self.dlg = MonPluginDialog() # Declare instance attributes self.actions = [] self.menu = self.tr(u'&MonPlugin') # TODO: We are going to let the user set this up in a future iteration self.toolbar = self.iface.addToolBar(u'MonPlugin') self.toolbar.setObjectName(u'MonPlugin') # Initialisation des valeurs par défault self.dlg.lineEdit_CoveredProp_Enterprises.setText("30") self.dlg.lineEdit_CoveredProp_Public.setText("40") # Validateurs des paramètres utilisateurs self.dlg.lineEdit_CoveredProp_Enterprises.setValidator(QDoubleValidator()) self.dlg.lineEdit_CoveredProp_Public.setValidator(QDoubleValidator()) regexp = "^(100|[0-9]{1,2})?$" self.dlg.lineEdit_CoveredProp_Enterprises.setValidator(QRegExpValidator(QRegExp(regexp))) self.dlg.lineEdit_CoveredProp_Public.setValidator(QRegExpValidator(QRegExp(regexp)))
puis ... plus loin, je rajoute ma fonction à l'intérieur de la classe de mon plugin (en plus des autres fonctions par défaut lorsque l'on génère le plugin), qui prend 2 paramètres ... le layer et le champ sur lequel sera appliqué la symbologie :
Code:
def applyGraduatedSymbology(self, vectorLayer, targetField): colorRamp = QgsVectorGradientColorRampV2.create({'color1' : '242,252,255,255', 'color2' : '0,19,77,255', 'stops' : '0.5;80,124,166,255'}) renderer = QgsGraduatedSymbolRendererV2.createRenderer(vectorLayer, targetField, 5, QgsGraduatedSymbolRendererV2.Jenks, QgsFillSymbolV2(), colorRamp) vectorLayer.setRendererV2(renderer)
puis... j'essaie d'appeler ma fonction applyGraduatedSymbology dans la fonction "run" (également à l'intérieur de la classe de mon plugin):
Code:
def run(self): # Récupère le dossier des couches pour les chemins relatifs si le Projet QGS est bien ouvert path = os.path.dirname(QgsProject.instance().fileName()) nameL = "/Data/Ma_couche_1.shp" # show the dialog self.dlg.show() # Run the dialog event loop result = self.dlg.exec_() # See if OK was pressed if result: if (1+1) == 2: [b]# Oui c'est un test à la con, mais je cherche à vérifier si la checkbox est cliquée, je n'ai pour l'instant pas réussi mais ce n'est pas le sujet du jour :)[/b] # J'ouvre ma couche fileR = path + nameL layerR = QgsVectorLayer(fileR, "Layer_1", "ogr") pr = layerR.dataProvider() for feat in layer.getFeatures(): [b]# Ici, je fais un super méga calcul :o (mais je vous passe les détails...) [/b] writefieldtest = layer.fieldNameIndex("TEST") layer.changeAttributeValue(feat.id(),writefieldtest,mon_attribut) layer.commitChanges() # Aplique la symbologie du B2C [b]Et c'est là que, normalement, j'aimerai faire applyGraduatedSymbology(self, Layer_1,"TEST")[/b] [b] Mais c'est là que ça bloque....[/b] QgsMapLayerRegistry.instance().addMapLayer(Layer_1) mc = self.iface.mapCanvas() mc.refresh()
L'erreur résultante est : global name 'applyGraduatedSymbology' is not defined
Il doit y avoir un petit quelque chose que j'ai oublié... ou qqc que je n'ai pas bien compris avec le "self" (à vrai dire je ne comprends pas trop bien le principe des classes en python alors c'est sûrement pour cela que ça bloque....). J'ai bien cherché des solutions sur mon ami google mais je n'ai pas trouvé d'exemples s'approchant du mien avec ce type d'erreur alors si qqn ici peu m'aiguiller un petit peu
Merci beaucoup,
Hors ligne
#2 Tue 21 June 2016 12:16
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: Plugin QGIS - Fonction non définie "global name..."
Eureka !
Alors pour celles et ceux, comme moi, qui ne sont par encore ULTRA à l'aise en python.... voici la solution (trouvé grâce à une lumière qui s'est éclairée d'un coup dans mon cerveau !) :
dans votre fonction run, au moment d'appeler la fonction que vous avez créé "applyGraduatedSymbology" faites simplement :
self.applyGraduatedSymbologyB2C(parametre1,parametre2)
Je savais bien que c'était une histoire de "self"....
Bon courage à tous ceux qui créent des plugin sur QGIS
Dernière modification par Cerise45 (Tue 21 June 2016 12:16)
Hors ligne