Python TarekSboui PDF
Python TarekSboui PDF
Python TarekSboui PDF
Python
Tarek SBOUI
Etapes de la programmation
• Écrire un algorithme
• Écrire un programme dans un langage (e.g. Java,
C++, python)
• Compiler le programme
– Traduire le programme dans un langage de bas
niveau (machine)
– [éventuellement optimisation]
– Produire un programme (code) exécutable
• Exécuter le programme
– Charger le programme en mémoire
– Exécuter le programme pour avoir le résultat
1
Termes
• Syntaxe d’un langage
– Comment formuler une instruction correcte
(grammaire)
• Sémantique
– Ce que l’instruction réalise
• Erreur
– de compilation: typiquement reliée à la syntaxe
– d’exécution: sémantique (souvent plus difficile à
détecter et corriger)
Python
• Open-source : son utilisation est gratuite et les fichiers
sources sont disponibles et modifiables;
• Facile à apprendre, à lire et à écrire ;
• Portable (fonctionne sous de plusieurs systèmes
d'exploitation) ;
• Doté d’une communauté active (plusieurs bibliothèques
disponibles);
• Orienté objet ;
• Typage dynamique
2
Python : Compilation et Executuon
>>> 5+3
>>> 2 - 9 # les espaces sont optionnels
>>> 7 + 3 * 4 # la hiérarchie des opérations
mathématiques
# est-elle respectée ?
>>> (7+3)*4
>>> 20 / 3
3
Noms de variables et mots réservés
Les noms de variables sont des noms qu’on choisit assez librement.
2. Seules les lettres ordinaires sont autorisées. Les lettres accentuées, les cédilles, les
espaces, les caractères spéciaux tels que $, #, @, etc. sont interdits, à l'exception du
caractère _ (souligné).
En plus de ces règles, il faut encore ajouter que vous ne pouvez pas utiliser
comme noms de variables les 29 « mots réservés » au langage ci-dessous :
4
Affectation
Nous savons désormais comment choisir judicieusement un nom de variable.
Voyons à présent comment nous pouvons en définir et affecter une valeur.
>>> msg = "Quoi de neuf ?" # affecter la valeur "Quoi de neuf ?" à msg
>>> n
7
>>> msg
"Quoi de neuf ? "
>>> pi
3.14159
5
Affectations multiples
Sous Python, on peut assigner une valeur à plusieurs variables simultanément.
Exemple :
>>> x = y = 7
>>> x
7
>>> y
7
On peut aussi effectuer des affectations parallèles à l'aide d'un seul opérateur :
>>> a, b = 4, 8.33
>>> a
4
>>> b
8.33
Exercice
1. Décrivez le plus clairement possible ce qui se passe à chacune des trois
lignes de l'exemple ci-dessous :
>>> largeur = 20
>>> hauteur = 5 * 9.3
>>> largeur * hauteur
(?)
6
Opérateurs et expressions
On manipule les valeurs et les variables qui les référencent, en les
combinant avec des opérateurs pour former des expressions.
Exemple :
a, b = 7.3, 12
y = 3*a + b/5
Exercice
Décrivez ce qui se passe à l’exécution des lignes suivantes :
Structures de contrôle
7
Structures de contrôle
Les structures de contrôle sont les groupes d'instructions
qui déterminent l'ordre dans lequel les actions sont
effectuées dans le programme.
Séquence d’instructions :
Sauf mention explicite, les instructions d'un programme s'exécutent les unes
après les autres, dans l'ordre où elles ont été écrites à l'intérieur du programme.
Le « chemin » d’exécution est appelé un flux d'instructions, et les constructions
qui le modifient sont appelées des instructions de contrôle de flux.
Python exécute normalement les instructions de la première à la dernière, sauf
lorsqu'il rencontre une instruction conditionnelle comme l'instruction «if». Une
telle instruction va permettre au programme de suivre différents chemins
suivant les circonstances.
début d’exécution
if
circonstance1 circonstance2
fin d’exécution
8
Sélection ou exécution conditionnelle
• C’est une technique permettant d'aiguiller le déroulement du programme dans
différentes directions, en fonction des circonstances rencontrées.
• Disposer d'instructions capables de tester une certaine condition et de modifier le
comportement du programme en conséquence.
L'instruction if.
>>> a = 150
>>> if (a > 100):
... "a dépasse la centaine"
...
Indentation obligatoire
En interactif :
Frappez encore une fois <Enter>. Le programme s'exécute, et vous obtenez :
a dépasse la centaine.
Recommencez le même exercice, mais avec a = 20 en guise de première ligne : cette fois Python
n'affiche plus rien du tout.
>>> a = 20
>>> if (a > 100):
"a dépasse la centaine"
else:
"a ne dépasse pas cent"
En interactif :
Frappez <Enter> encore une fois. Le programme s'exécute, et affiche cette fois :
a ne dépasse pas cent.
9
On peut faire mieux encore en utilisant aussi l'instruction elif (contraction
de « else if ») :
a=0
if a > 0 :
" a est positif "
elif a < 0 :
"a est négatif"
else:
"a est nul"
Exercice
10
>>> a = input('Entrez la première valeur : ')
>>> b = input('Entrez la deuxième valeur : ')
>>> if (a<b):
print (a)
else:
print (b)
nom :
11
Opérateurs de comparaison
La condition évaluée après l'instruction «if» peut contenir les opérateurs de
comparaison suivants :
x == y # x est égal à y (deux signes « égale » et non d'un seul)
x != y # x est différent de y
x>y # x est plus grand que y
x<y # x est plus petit que y
x >= y # x est plus grand que, ou égal à y
x <= y # x est plus petit que, ou égal à y
Exemple :
>>> a = 7
>>> if (a % 2 == 0):
"a est pair"
"parce que le reste de sa division par 2 est nul"
else:
"a est impair"
Répétitions en boucle
L'instruction while
L'une des tâches que les machines font le mieux est la répétition sans
erreur de tâches identiques !
>>> a = 0
>>> while (a < 7): # (n'oubliez pas le double point !)
a = a + 1 # (n'oubliez pas l'indentation /alignement!)
a
3. Que se passe-t-il ?
12
>>> a = 0
>>> while (a < 7): # (n'oubliez pas le double point !)
... a = a + 1 # (n'oubliez pas l'indentation !)
...a
Commentaires
1. Dans notre exemple, si la condition a < 7 est encore vraie, le corps de la boucle est exécuté une
nouvelle fois et le bouclage se poursuit.
2. La variable évaluée dans la condition doit exister au préalable (Il faut qu'on lui ait déjà affecté au
moins une valeur)
3. Si la condition est fausse au départ, le corps de la boucle n'est jamais exécuté
4. Si la condition reste toujours vraie, alors le corps de la boucle est répété indéfiniment.
>>> n = 3
>>> while n < 5:
"hello !"
Répétitions en boucle
L'instruction for
entête
for <variable> in range(<nombre de repetitions>):
<instruction1>
< instruction2>
… corps
< instructionn>
13
>>> for x in range(0,3):
print('Hello!')
print (x)
x=0
While (x<3):
print('Hello!')
print (x)
x=x+1
14
Exercice
Écrire un programme qui affiche les 3 premiers termes de la table
de multiplication par 7.
Les fonctions en
Python
15
Les fonctions en Python
Il arrivera souvent qu'une même séquence d'instructions doive être utilisée à
plusieurs reprises dans un programme, et on souhaitera bien évidemment ne
pas avoir à la reproduire systématiquement.
Pour utiliser la fonction que nous venons de définir, il suffit de l'appeler par
son nom. Ainsi :
>>> table7()
Provoque l'affichage de :
7 14 21 28 35 42 49 56 63 70
16
Fonctions avec paramètres
La fonction table() telle que définie ci-dessous utilise le paramètre base
pour calculer les dix premiers termes de la table de multiplication de base.
Exercice
Écrivez un programme qui contient une fonction carre qui calcule
le carré d’un nombre envoyé comme paramètre.
17
Une fonction peut avoir plusieurs paramètres.
Exemple : Ajouter des paramètres supplémentaires, dans une nouvelle version que nous
appellerons cette fois tableMulti() :
Exercice
Écrivez un programme qui contient une fonction addition qui
calcule la somme de deux nombres envoyés comme paramètre.
18
Appel/utilisation d’une fonction à
partir d’une autre
Les fonctions peuvent aussi s'utiliser dans d’autres fonctions.
Exemple : Ecrire une programme qui calcule le volume d'une sphère à
l'aide de la formule :
19
Listes et dictionnaires
Listes
Une liste : une collection d'éléments séparés par des virgules, l'ensemble étant
enfermé dans des crochets.
Exemple :
>>> jour = ['lundi', 'mardi', 'mercredi', 100, 20.3]
>>> print (jour)
['lundi', 'mardi', 'mercredi', 100, 20.3]
Exemple :
>>> jour = ['lundi', 'mardi', 'mercredi', 100, 20.3]
>>> print (jour[2])
mercredi
>>> print (jour[4])
20.3
20
Remplacer certains éléments d'une liste par d'autres, comme ci-dessous :
>>> jour[3] = ‘jeudi'
>>> print (jour)
Exercice
Analyser le script ci-dessous et commenter son fonctionnement :
>>>jour =
['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi']
>>> a = 0
while a<7:
print (a , jour[a])
a=a+1
21
Listes imbriquées
Le premier élément dans une liste peut être n'importe quelle
expression, y compris une autre liste.
>>> matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
Exercice
Définissez une fonction listeMax(liste) qui renvoie
l'élément ayant la valeur la plus élevée dans la liste
transmise en argument.
Exemple d'utilisation :
serie = [5, 8, 2, 1, 9, 3, 6, 7]
listeMax(serie )
renvoie
9
22
Exercice
Définissez une fonction remplirListe(liste, n) qui
reçoit une liste vide et un entier n, et renvoie cette
liste remplie avec n entiers introduits par l’utilisateur.
Exemple d'utilisation :
>>> serie = []
>>> remplirListe(serie, 3)
renvoie
[3, 5, 7]
23
Exercice
Définissez une fonction indiceMax(liste) qui
renvoie l’indice de l'élément ayant la valeur la plus
élevée dans la liste remplie par l’utilisateur.
Exemple d'utilisation :
serie = [5, 8, 2, 1, 9, 3, 6, 7]
indexMax(serie )
renvoie
4
Dictionnaire
• Un dictionnaire permet de stocker des
paires appelées éléments.
{ 'Cle1' : 'valeur1', 'Cle2' : 'valeur2'}
• Chaque paire d'entrées contient : une clé
et une valeur
• La clé doit être unique dans le
dictionnaire.
24
my_dict = {'nom':'Mariem', 'age': 26}
my_dict ['nom'] est 'Mariem' . my_dict
['age'] est 26
• voiture= {
“marque": "Ford",
"modele": "Mustang",
“annee": 1964
}
# supprimer un element
del my_dict ['address']
25
my_dict.items() # renvoyer les elements
my_dict.keys() # renvoyer les cles
my_dict.values() # renvoyer les valeur
Exercise
• Créez trois dictionnaires contenant chacun
deux clés nom, annee. Puis créez un
dictionnaire qui contient les trois autres
dictionnaires.
26
Solution
• child1 = {"nom":"Sarra","annee":2004 }
child2 = {"nom":"Ali","annee":2002 }
child3 = {"nom":"Fatma","annee":2000 }
myfamily = {
"ch1" : child1,
"ch2" : child2,
"ch3" : child3
}
La programmation
Orientée Objet dans
Python
27
La programmation Orientée
Objet (POO) dans Python
• Il y plusieurs types de base en Python (int, float, str,
etc.).
• La notion de classe permet d’entendre la notion de «
type » en créant de nouvelles structures/types de
données (les classes).
• Une classe contient des attributs et des méthodes.
– Exemple, une classe voiture peut être caractérisée par
un attribut couleur, un attribut vitesse, etc. La classe
Voiture pourra également définir une méthode rouler().
28
POO - Définition des attributs
>>> class Point:
"c’est une classe"
>>> p = Point()
>>> p.x = 1
>>> p.y = 2
>>> print("p : x =", p.x, "y =", p.y)
29
POO - Définition des methodes
class Point:
def deplace(self, dx, dy):
self.x = self.x + dx
self.y = self.y + dy
30
POO- La notion de constructeur
>>> class Point:
def __init__(self):
self.x = 0
self.y = 0
>>> a = Point()
>>> print("a : x =", a.x, "y =", a.y)
>>> a.x = 1
>>> a.y = 2
>>> print("a : x =", a.x, "y =", a.y)
class Point:
def __init__(self, abs, ord):
self.x = abs
self.y = ord
a = Point(1, 2)
print("a : x =", a.x, "y =", a.y)
31
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
a = Point(1, 2)
print("a : x =", a.x, "y =", a.y)
POO - exemple
>>> class Point:
def __init__(self, abs, ord):
self.x = abs
self.y = ord
def deplace(self, dx, dy):
self.x = self.x + dx
self.y = self.y + dy
32
>>> a = Point(1, 2)
>>> b = Point(3, 4)
>>> print("a : x =", a.x, "y =", a.y)
>>> print("b : x =", b.x, "y =", b.y)
>>> a.deplace(3, 5)
>>> b.deplace(-1, -2)
>>> print("a : x =", a.x, "y =", a.y)
>>> print("b : x =", b.x, "y =", b.y)
Methode statique
Une méthode statique peut être appelée sans créer d’objet/instance.
class Music:
@staticmethod
def play():
print("*playing music*")
def stop(self):
print("stop playing")
m= Music()
m. play()
Music.play()
Music.stop() # Erreur. On doit creer un objet
# -------------------------- solution :
obj = Music()
obj.stop()
33
Python et SIG
34
Bibliothèques Python-QGIS
• QGIS intègre des bibliothèques dans l’environnement
Python. Ce sont principalement des bibliothèques
géographiques (QT et QGIS).
• Les bibliothèques QT et QGIS sont deux bibliothèques bien
documentées qui peuvent être utilisées pour développer des
codes Python dans QGIS.
• Vous n'avez pas besoin de savoir le contenu de la
bibliothèque, mais plutôt de pouvoir l’utiliser dans votre code.
On utilise plutôt l’interface de la bibliothèque (API -
Application programming interface).
• Il s’agit de trouver l’API et parcourir ses modules.
• Qt
• QGIS étant construit à l'aide de Qt , un grand nombre de
classes QGIS héritent de la classe Qt de base (QObject).
Les classes de l'API PyQt sont disponibles à l'adresse
suivante : https://doc.qt.io/qt-5/classes.html. Vous trouvez
une liste de toutes les classes Qt.
35
• QGIS
• L’API QGI est décrite d’une façon similaire à celle de l’API
QT.
• La documentation de base de l’API QGIS est disponible à
l'adresse suivante: https://qgis.org/api .
• Vous pouvez obtenir la liste des classes de l'API QGIS à
l’adresse suivante: https://qgis.org/api/annotated.html
36
layer = iface.activeLayer ()
print(type (layer))
• Résultat :
– < classe ' qgis ._ core.QgsVectorLayer ' >
layer.featureCount ()
• Résultat :
– 177
layer = iface.activeLayer()
features = layer.getFeatures() # collection d’entites (objets de type
QgsFeature)
for feat in features: # nous itérons sur les entités des
couches
print (feat["name"] )
37
• Voici un exemple qui détermine la population totale du
monde en calculons les valeurs dans le champ pop_est (la
population de chaque pays).
layer = iface.activeLayer()
features = layer.getFeatures() # collection d’entites (objets de type
QgsFeature)
totalPopulation = 0
for feat in features: # nous itérons sur les entités des couches
pop = feat["pop_est"] # retrouver la valeur de la population en
utilisant l’entite sous forme de dictionnaire et le nom du
champ comme clé.
if pop > 0:
totalPopulation += pop
print (totalPopulation)
38
Visualiser et filtrer une couche
vectorielle
• Ouvrir une couche vectorielle
• Pour ouvrir une couche vectorielle dans QGIS, vous pouvez
utiliser la méthode addVectorLayer () de la classe
QgisInterface (qgis.gui.QgisInterface). Cette méthode permet
d’ajouter la couche dans le canevas.
• Voici un exemple :
ch = os.path.join(QgsProject.instance().homePath(),
"data", "populated_places.shp")
# ou chemin absolu : Ch =“C:/document/…/ populated_places.shp ”
39
• Vous pouvez ouvrir plusieurs fichiers se trouvant dans le
même répertoire.
ch = os.path.join(QgsProject.instance().homePath(),
"data", "") # permet d’ouvrir tous les fichiers de ce
repertoire
vlayer = iface.addVectorLayer(ch, "", "ogr")
if not vlayer:
print("Layer failed to load!")
ch = “c:/ …../countries.shp”
vlayer = QgsVectorLayer (ch, "", "ogr")
Nbre = vlayer.featureCount ()
40
• Afficher les attributs d’une couche
vectorielle
41
• Maintenant, en utilisant iface.addVectorLayer au lieu de
QgsVectorLayer, affichez dans le canevas uniquement les
entités géographiques qui respectent la contrainte
précédente.
vlayer = iface.addVectorLayer(ch,
"","ogr").setSubsetString("NAME LIKE 'A%'")
# ou avec activeLayer().
vlayer = iface.activeLayer().setSubsetString("NAME LIKE
'A%'")
vlayer = iface.activeLayer().setSubsetString("")
42
Edition d’une couche vectorielle
• Créer un nouvel objet de la classe QgsVectorLayer. La
nouvelle couche se caractérise par "Point" comme géométrie,
"temp" comme nom de la couche, et "memory" comme
fournisseur de données (data provider).
pr = vl.dataProvider()
chp1 = QgsField("name",QVariant.String)
chp2 = QgsField("age",QVariant.Int)
chp3 = QgsField("size",QVariant.Int)
pr.addAttributes([chp1, chp2, chp3])
vl.updateFields()
43
• Pour valider l’ajout de l’attribut à la couche, nous devons
appeler la méthode updateFields().
• Nous pouvons ajouter un attribut en utilisant la méthode
addAttribute () de la classe QgsVectorLayers.
vl.startEditing()
my_field_name = 'new field'
vl.addAttribute(QgsField(my_field_name, QVariant.String))
vl.updateFields()
for field in vl.fields():
print (field.name ())
# Affichage de donnees
for f in vl.getFeatures():
print("Feature:", f.id(), f.attributes(),
f.geometry().asPoint())
44
• Pour supprimer un attribut, on utilise la méthode
deleteAttributes.
vl.dataProvider().deleteAttributes([3])
vl.updateFields()
f = QgsFeature()
f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10,10)))
f.setAttributes(["Point 1.", 2, 0.3])
pr.addFeature(f)
vl.updateExtents()
45
• Affichons maintenant quelques informations sur la couche:
for f in vl.getFeatures():
print("Feature:", f.id(), f.attributes(), f.geometry())
# attributes() : cherche les valeurs se basant sur les noms des
attributs
pr.deleteFeatures([2]) # feature id
vl.updateExtents()
46
Manipulation de données
raster
• Afficher une couche raster
• Utiliser la méthode addRasterLayer () de la classe
QgisInterface : permet d’ajouter la couche raster dans le
canevas.
ch = os.path.join(QgsProject.instance().homePath(),
"data/ndvi", "farm-field2.tif")
rlayer = iface.addRasterLayer(ch, 'layer name')
47
Symbologie d’un raster
• Créer une palette de couleurs, et l’utiliser pour définir une
symbologie de la couche raster. Pour cela, nous
commençons par déterminer les valeurs minimum et
maximum d’une bande de cette couche (exemple : bande
numéro 1).
stats = rlayer.dataProvider().bandStatistics(1,
QgsRasterBandStats.All)
# Ensuite, nous aurons les valeurs minimum et maximum.
min = stats.minimumValue
max = stats.maximumValue
• Ensuite :
48
• Les données qu’on utilise représentent
des altitudes, qui sont des données
continues, donc on utilise une palette
interpolée.
palette = QgsColorRampShader()
palette.setColorRampType(QgsColorRampShader.Interpolat
ed)
lst = [QgsColorRampShader.ColorRampItem(min,
QColor(0,255,0)), QgsColorRampShader.ColorRampItem(max,
QColor(255,0,0))]
# Constructs a color with the RGB value r, g, b. here green for min and red for max
palette.setColorRampItemList(lst)
49
• c) Attribuer la palette de couleur à un QgsRasterShader
• Nous attribuons la palette de couleur à un objet de la classe
QgsRasterShader afin qu’il puisse être utilisé pour symboliser
une couche raster.
shader = QgsRasterShader()
shader.setRasterShaderFunction(palette)
renderer =
QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(),
1, shader)
rlayer.setRenderer(renderer)
50
Interroger une couche raster
• Déterminer les coordonnées d’un point qui se situe quelque
part dans la zone couverte par une couche raster.
• Les coordonnées devront être dans les mêmes unités que la
projection utilisée pour afficher la couche.
• Interroger la couche raster en utilisant deux méthodes
différentes sample () et identifier ().
51
• 2- Valeur de la requête avec identifier ()
• La méthode identifier () de layer.dataProvider () est similaire
au pointeur d’identification utilisé dans l'interface QGIS. La
méthode identifier () retourne un dictionnaire contenant le
numéro de bande et la valeur de toutes les bandes de la
couche raster. Nous spécifions un point de type QgsPointXY
et le format du résultat (IdentifyFormatValue)
ident = rlayer.dataProvider().identify(QgsPointXY(714093,
3803770), QgsRaster.IdentifyFormatValue)
print(ident.isValid())
print (ident.results())
52
rasterName4 = "bandd4"
rasterName5 = "bandd5"
chrep = QgsProject.instance().homePath()+ "data/raster/ndvi"
rband4 = QgsRasterLayer(chrep + "/TunB4.tif", rasterName4)
rband5 = QgsRasterLayer(chrep + "/TunB5.tif", rasterName5)
r.raster = rband4
ir.raster = rband5 # Couche raster associée à cette entrée
53
Manipulation de plusieurs
sources de données raster
• Un avantage important de la programmation Python
dans QGIS est de pouvoir traiter plusieurs couches
automatiquement, et en même temps.
• Le code suivant permet de convertir les valeurs
d’élévation du mètre en kilomètre, et ce, pour plusieurs
fichiers contenant des données raster.
import os
from os import listdir
from os.path import isfile, join
chrep = os.path.join(QgsProject.instance().homePath(),
"data/raster/elev/",)
myfiles = [f for f in listdir(chrep) if isfile(join(chrep, f))]
for myf in myfiles:
filename, file_extension = os.path.splitext(myf)
rasterName = filename
raster = QgsRasterLayer(chrep+myf, rasterName)
r = QgsRasterCalculatorEntry()
r.raster = raster
r.bandNumber = 1
r.ref = rasterName + "@1"
print ("ref : ",r.ref)
print ("raster", r.raster.name())
references = (r.ref)
54
exp = "%s / 1000" % references
output = chrep+"mil"+myf
print ("output : ", output)
e = raster.extent()
w = raster.width()
h = raster.height()
entrees = [r]
Plugins
• Les plugins sont un excellent moyen d’étendre les
fonctionnalités de QGIS. On peut écrire des plugins en
utilisant Python.
• On peut utiliser un modèle existant : ex. le Minimal QGIS
plugin template. Ce modèle contient le minimum nécessaire
pour créer un plugin dans QGIS.
• Il se compose de deux fichiers: un fichier texte contenant des
métadonnées, et un fichier contenant un code Python.
55
• Comment l'utiliser?
• Créer un nouveau répertoire "minimal" : Settings -> User profiles
-> Open Active Profile Folder. Vous trouverez python/plugins.
• Copiez metadata.txt et __init__.py dans ce répertoire.
• Démarrer QGIS et activer le plugin (menu Plugins> Manager
and Install Plugins ...)
• Maintenant, vous devriez voir un "Bonjour" bouton dans la barre
d’outils "Plugins" (assurez-vous qu’il est activé dans le menu
View> Toolbars > Plugins Toolbar).
metadata.txt :
• Ce fichier est utilisé pour décrire le plugin. QGIS l'utilisera pour
gérer les versions des plugins et afficher les informations dans le
gestionnaire de plugins.
• Le fichier contient les lignes suivantes:
[general]
name=minplugin
description= Plugin minim
version=1.0
qgisMinimumVersion=3.0
author=Tarek [email protected]
56
__init__.py :
• Ce fichier ne contient une seule méthode qui sert à informer QGIS de la
classe de plugins qu'il doit charger pour instancier le plugin. Ce fichier
contient :
classFactory ( )
• C’est une méthode obligatoire dans le fichier __init__.py. Il devrait retourner
un objet de la classe qui représente le plugin (MinPlugin dans notre cas).
def classFactory(iface):
return MinPlugin (iface)
plugin.py :
• Ce fichier contient la classe du plugin MinPlugin. Toutes les classes de
plugins doivent contenir les quatre méthodes suivantes.
__ init __ (self, iface )
• Cette méthode devrait contenir tout le code nécessaire pour initialiser le
plugin, à l'exception des éléments de l'interface graphique. Les éléments de
l'interface graphique sont initialisés dans la méthode initGui ( ).
• Dans notre exemple, l’objet QgisInterface (iface) est passé aux plugins lors
de son instanciation (à noter que pouvons utiliser cet objet dans d'autres
méthodes de la classe).
57
initGui(self)
• C'est ici que le contenu de l'interface graphique doit être initialisé. Dans
notre exemple, nous ajoutons le menu du plugin à la barre de menus de
QGIS.
def initGui(self):
self.action = QAction(u'Bonjour', self.iface.mainWindow())
self.action.triggered.connect(self.run)
self.iface.addToolBarIcon(self.action)
unload (self)
• Les opérations de nettoyage doivent être effectuées ici. Ils seront exécutés
lorsque le plugin est désactivé à l'aide du gestionnaire de plugins ou à la
fermeture de QGIS). Dans notre cas, nous supprimons le menu du plugin
qui a été ajouté dans la méthode initGui() et l'action associée.
def unload(self):
self.iface.removeToolBarIcon(self.action)
del self.action
58
Installer un plugin
• Une fois que vous avez écrit le code de votre plugin, vous
devez l'installer dans votre application QGIS. Dans QGIS 3,
les plugins se trouvent dans le répertoire python/plugins.
Vous pouvez trouver ce répertoire en choisissant le menu :
Settings -> User profiles -> Open Active Profile Folder.
• Vous pouvez copier l'exemple de plugin. Après le démarrage
de QGIS, le plugin devrait être disponible pour être
exécuté. Si ce n'est pas le cas, vous devrez l'activer dans
QGIS Plugin Manager.
Références
59