Suite

Comment puis-je accéder aux éléments du répertoire (some_class) de PyQGIS sans dictionnaire dans mon code ?

Comment puis-je accéder aux éléments du répertoire (some_class) de PyQGIS sans dictionnaire dans mon code ?


Je développe un plugin QGIS pour rechercher des méthodes de classe dans les différentes classes de PyQGIS. J'ai utilisé trois widgets : 2 objets de type QLineModifier (pour les classes et les méthodes de classe) et un Navigateur QText (pour les résultats). Le code coupé est ci-dessous :

… def run(self): """Méthode d'exécution qui effectue tout le vrai travail""" text_search_class = self.dlg.lineEdit.text() text_search_line = self.dlg.lineEdit2.text() dict = {'QgsVectorLayer' : dir(QgsVectorLayer) 'QgsRasterLayer' : dir(QgsRasterLayer), 'QLineEdit' : dir(QLineEdit)} if ( text_search_class in dict.keys() ) == True: idx = dict.keys().index(text_search_class) elements = getPat2(text_search_line, dict.values()[idx]) n = len(elements) message = str(n) + " éléments de '" + text_search_line + "' in " + text_search_class + "

" pour i dans range(n - 1) : message += elements[i] + ', ' if n != 0 : message += elements[n - 1] txtBox = self.dlg.textFeedback txtBox.setText(message) else : message = "La classe choisie n'existe pas" txtBox = self.dlg.textFeedback txtBox.setText(message) # affiche la boîte de dialogue self.dlg.show() # Exécute la boucle d'événement de la boîte de dialogue result = self.dlg.exec_() # Voir si OK a été pressé si le résultat : # Faites quelque chose d'utile ici - supprimez la ligne contenant pass et # remplacez par votre code . passer

Mon problème est que j'ai dû utiliser un dictionnaire pour obtenir la liste des méthodes de dir(classe) (dans mon code je n'utilise que QgsVectorLayer, QgsRasterLayer et QLineModifier; mais ils sont plus de 1200) car, par exemple, la vraie liste est pour dir(QgsVectorLayer); pas pour dir('QgsVectorLayer') quand je n'utilise pas le dictionnaire. Ma question est de savoir comment puis-je accéder aux éléments dans dir (some_class) de PyQGIS sans dictionnaire.

Les images suivantes montrent l'exécution du plugin.

Sans texte à rechercher :

Recherche par attente, définissez y max, respectivement, dans QgsVectorLayer, QgsRasterLayer et QLineModifier:


Cela ressemble à un plugin intéressant, et j'en aurais beaucoup l'utilité.

Vous pouvez utiliser le inspecter le module pour jeter un coup d'œil à l'intérieur des objets sans utiliser de dictionnaires. Mieux encore, vous pouvez jeter un coup d'œil au code, aux commentaires, aux listes d'arguments, etc. Ce dernier serait utile pour un plugin comme celui-ci ;-)

Voici un exemple rapide pour vous aider à démarrer… dans ce cas, j'ouvre un fichier dans GDAL et inspecte l'objet de source de données renvoyé, et liste toutes les méthodes que je trouve.

depuis osgeo import ogr depuis osgeo import osr depuis osgeo import gdal depuis gdalconst import GA_ReadOnly ds = gdal.Open("/tmp/hmap.tif",GA_ReadOnly) import inspect object = ds for item in inspect.getmembers(object): # renvoie tuple (nom, objet) si inspect.ismethod(item[1]): imprime l'élément

et le résultat final…

('AddBand',  >>) ('BeginAsyncReader',  >>) ('BuildOverviews',  >>) ('CréerMaskBand',  >>) ('EndAsyncReader',  >>) ('FlushCache',  >>) ('Obtenir la description',  >>) ('GetDriver',  >>)… et bien plus

La solution à ce problème était ici :

https://stackoverflow.com/questions/295058/convert-a-string-to-preexisting-variable-names/295113#295113

Les mots clés étaient dans le titre : "Convertir une chaîne en noms de variables préexistants".

Mon nouveau code est maintenant :

… def run(self): """Méthode d'exécution qui effectue tout le vrai travail""" text_search_class = self.dlg.lineEdit.text() text_search_line = self.dlg.lineEdit2.text() try: elements = getPat2(text_search_line , dir(globals()[text_search_class])) n = len(elements) message = str(n) + " éléments de '" + text_search_line + "' in " + text_search_class + "

" pour i in range( n - 1) : message += elements[i] + ', ' if n != 0 : message += elements[n - 1] txtBox = self.dlg.textFeedback txtBox.setText(message) sauf KeyError : message = " La classe choisie n'existe pas" txtBox = self.dlg.textFeedback txtBox.setText(message) # affiche la boîte de dialogue self.dlg.show() # Exécute la boucle d'événement de la boîte de dialogue result = self.dlg.exec_() # Voir si OK a été pressé si résultat : # Faites quelque chose d'utile ici - supprimez la ligne contenant pass et # remplacez par votre code. passer

Les images suivantes montrent l'exécution du plugin avec les nouvelles classes extraites avec globales() (sans dictionnaire):


Voir la vidéo: QGIS Python PyQGIS - Dissolve