Initiation à la programmation python
Séance en ligne du 24/01/2021
Enseignante Tutrice : Mme Mansouri L.
Partie abordée :
Module 10: Les modules
Module 11: Les interfaces graphiques avec tkinter
Module 12: Le module Numpy
Module 10:
Les modules
1. Présentation des modules
4
Un module est un fichier script Python permettant de définir des éléments de programme réutilisables. Ce mécanisme permet d’élaborer efficaçement des bibliothèques de fonctions ou de classes.
Avantages des modules :
▪ réutilisation du code; ▪ la documentation et les tests peuvent être intégrés au module; ▪ réalisation de services ou de données partagés; ▪ partition de l’espace de noms du système.
2. Chargement des modules externes
Syntaxe from module import *
from module import fonctions_a_importer import module
Description Charger la totalité du module. Cette instruction charge le module, l’éxécute et place toutes les fonctions du module (et noms variables) courant
l’espace
dans
de
Charger que certaines fonctions du module On importe le module. En revanche les fonctions ne sont plus placées dans l’espace de noms courants mais dans un espace propre. Pour y accéder, il faut préciser qu’on utilise la fonction dans cet espace de noms
Exemples from math import *
from math import sin,cos
import math
import module nom_alias
as
Faciliter l’utilisation en précisant un alias pour cet espace de noms
import math as m
6
L’utilisation d’un objet d’un module (les variables, les constantes, les fonctions,..) se fait avec cette syntaxe :
module.objet module.fonction(param1, param2, ...)
Exemples :
import datetime
x = datetime.datetime.now() print(x) x = datetime.datetime(2020, 10, 10) print(x) print(x.year)
import math
Affichage
from datetime import *
2020-10-10 08:53:11.288346 2020-10-10 00:00:00 2020
x = datetime.now() print(x) x = datetime(2020, 10, 10) print(x) print(x.year)
x = math.ceil(1.4) # arrondit un nombre vers le haut à son entier le plus proche y = math.floor(1.4) #arrondit un nombre vers le bas à son entier le plus proche print(x) # affiche 2 # affiche 1 print(y)
3. Modules personnalisés
Pour créer un module , il suffit d'écrire un ensemble de fonctions (et/ou de
constantes) dans un fichier, puis d'enregistrer ce dernier avec une extension .py (comme n'importe quel script Python).
Exemple :
puissance.py
"""Un module pour afficher la puissance des nombres"""
def carre(valeur):
resultat = valeur**2 return resultat
def cube(valeur):
resultat = valeur**3 return resultat
from puissance import carre
a = 5 u = carre(a) print("le carre vaut", u)
>>> import puissance >>> help(puissance) Help on module puissance: NAME
puissance - Un module pour afficher la puissance des nombres
FUNCTIONS
carre(valeur) cube(valeur)
FILE
d:\cours python\puissance.py
Les packages
un package :un dossier qui rassemble plusieurs modules.
Le nom du package est le même que celui du dossier.
On crée le fichier __init__.py dans le dossier, qui indique qu'il s'agit d'un package .
On peut importer des packages en utilisant la syntaxe:
nom-paquet.nom-module.nom-element.
Puissance.py
Operations.py
Test.py
def carre(valeur):
resultat = valeur**2 return resultat
def cube(valeur):
resultat = valeur**3 return resultat
def addition(val1,val2): return val1+val2
_init__.py
def multi(val1,val2): return val1*val2
from package1 import puissance,operations n1=int(input("donner une valeur 1 : ")) n2=int(input("donner une valeur 2 :")) r1=puissance.carre(n1) print("le carré est :",r1) r2= operations.multi(n1,n2)) print("la multiplication de ",n1," par",n2," est:",r2)
5. Quelques modules courants
9
▪ math : fonctions et constantes mathématiques de base (sin, cos, exp, pi...).
▪ sys : interaction avec l'interpréteur Python, passage d'arguments.
▪ os : dialogue avec le système d'exploitation.
▪ random : génération de nombres aléatoires.
▪ time : accès à l'heure de l'ordinateur et aux fonctions gérant le temps.
▪ Calendar : fonctions de calendrier ;
▪ urllib : récupération de données sur internet depuis Python.
▪ Tkinter : interface python avec Tk. Pour la création d'objets graphiques
▪ pickle : écriture et lecture de structures Python (comme les dictionnaires par
exemple).
▪ Pandas : un module complémentaire qui permet la manipulation et l’analyse des
données.
▪ Numpy :un module complémentaire destiné à offrir à Python des outils de calculs
scientifiques avancés.
Module 11:
Les interfaces graphiques avec Tkinter
1. Présentation du module
11
▪ Plusieurs autres bibliothèques graphiques ont été proposées pour python :
wxPython, pyQT, pyGTK, etc.
▪ Tkinter (Tool Kit interface) est un module intégré à la bibliothèque standard de Python,
permettant de créer des interfaces graphiques :
•des fenêtres, •des widgets (boutons, zones de texte, cases à cocher, …), •des évènements (clavier, souris, …).
▪ Tkinter est disponible sur Windows et la plupart des systèmes Unix : les interfaces crées avec
Tkinter sont donc portables.
▪ Tkinter a l'avantage d'être disponible par défaut, sans nécessiter une installation
supplémentaire.
2. Le squelette d’une interface tkinter
12
La création d’une interface graphique à l’aide de tkinter est faite en suivant ces étapes:
1
2
3
4
Importation du module tkinter
Création de la fenêtre principale de l’interface graphique
L’ajout de un ou plusieurs widgets graphiques
L’entrée de la boucle d’événements principale pour agir à chaque événement déclenché par l’utilisateur
Exemple
13
Import des noms du module from tkinter import
Création d'un objet "fenetre " qui servira de référence à tous les autres objets fenetre = Tk() fenetre.title("Exemple") # titre de la fenêtre principale fenetre.geometry("520x220") # dimension de la fenêtre principale
Titre (Label) On crée un objet-label « titre ». Les attributs sont : « fenetre » l’interface et le texte à afficher titre = Label(fenetre, text = " PYTHON, est fantastique ! " )
la méthode pack place l’objet titre dans "fenetre "
titre.pack()
Ajout des autres widgets # .........................
On crée une boucle sur "fenetre " pour qu’elle surveille en permanence ce qui s’y passe.
fenetre.mainloop()
2. Les widgets Tkinter
14
Les contrôles les plus utilisés :
Widget
Description
Label Entry Text
Un widget utilisé pour afficher du texte à l'écran Un widget de saisie de texte qui n'autorise qu'une seule ligne de texte Un widget de saisie de texte qui permet la saisie de texte multiligne
Checkbutton
est utilisé pour afficher un certain nombre d’options sous forme de cases à cocher. L’utilisateur peut sélectionner plusieurs options à la fois.
Radiobutton
Listbox Combobox Button
Frame
Canvas
est utilisé pour afficher un certain nombre d’options sous forme de boutons radio. L’utilisateur ne peut sélectionner qu’une seule option à la fois.
est utilisé pour fournir une liste d’options à un utilisateur. liste avec une barre de défilement incluse Un bouton qui peut contenir du texte et peut effectuer une action lorsque vous cliquez dessus Une région rectangulaire utilisée pour regrouper les widgets associés ou fournir un remplissage entre les widgets
est une zone rectangulaire destinée à contenir des dessins ou d’autres figures complexes.
2.1 Le contrôle zone de texte
15
Une zone de texte sert à insérer dans une fenêtre graphique une légende indiquant ce qu’il faut insérer dans contrôle voisin. Une zone de texte correspond à la classe Label. Pour créer une zone de texte, il suffit d’écrire la ligne suivante :
zone_texte =Label (fenetre, text = "zone de texte")
Il est possible de modifier les couleurs du texte,du fond ,de la police et sa taille:
label = Label(fenetre, text="Salut tout le monde !", fg="blue", bg="yellow" font = ("Helvetica", 32))
2.2 Le contrôle zone de saisie
16
Une zone de saisie a pour but de recevoir une information entrée par l’utilisateur. Une zone de saisie correspond à la classe Entry ; la syntaxe est la suivante :
saisie = tkinter.Entry ()
Pour modifier le contenu de la zone de saisie, il faut utiliser la méthode insert qui insère un texte à une position donnée.
saisie.insert (pos, "contenu")
Pour obtenir le contenu de la zone de saisie
contenu = saisie.get ()
Pour supprimer le contenu de la zone de saisie entre deux positions
saisie.delete (pos1, pos2) Exemple : saisie.delete (0, len(saisie.get()))
2.3 Le contrôle zone de saisie à plusieurs lignes
17
saisie = tkinter.Text()
Pour modifier le contenu de la zone de saisie, on utilise insert qui insère un texte à une position donnée.
Pour obtenir le contenu de la zone de saisie, il faut utiliser la méthode get qui retourne le texte entre deux positions. La position de fin n’est pas connue, on utilise la chaîne de caractères "end" pour désigner la fin de la zone de saisie.
Pour supprimer le contenu de la zone de saisie entre deux positions
Pour modifier les dimensions de la zone de saisie à plusieurs lignes
pos = "0.0" saisie.insert(pos,"première ligne\n seconde ligne")
pos1 = "0.0" pos2 = "end" #ou tkinter.END contenu = saisie.get (pos1, pos2)
saisie.delete (pos1, pos2) Exemple : saisie.delete(0, len(saisie.get()))
saisie.config(width,height) # width <--> largeur # height <--> hauteur en lignes Exemple: saisie.config (width = 10,height = 5)
2.4 Le contrôle case à cocher
18
Le widget Checkbutton est utilisé pour afficher un certain nombre d’options à un
utilisateur sous forme de case à cocher.
La syntaxe est la suivante :
case = Checkbutton ( master, option = value, ... )
Où: master : Cela représente la fenêtre parent. option : Voir ci-dessous la liste des options les plus utilisées
Tableau de quelques options pour le widget Checkbutton
Option
Description
bd bg fg font height
justify
width
Publicité
Largeur de bordure en pixels. La valeur par défaut est 2. Couleur de fond normale. Couleur normale du premier plan (texte). Police de texte à utiliser pour l’étiquette du Checkbutton. Hauteur du Checkbutton selon les lignes de texte. •LEFT pour justifier le texte à gauche de chaque ligne; •CENTER pour centrer le texte; •RIGHT pour justifier le texte à droite. Largeur du bouton en lettres (si du texte) ou en pixels (si une image).
19
Pour utiliser un Checkbutton, on doit créer une variable Tkinter et pour inspecter l’état du bouton, on doit interroger la variable.
from tkinter import * gui = Tk() var = IntVar() #mémorise la valeur de la case à cocher c = Checkbutton(gui, text="Ma CheckBox", variable=var) # gère l’apparence au niveau de l’interface graphique c.pack() mainloop()
Par défaut, la variable est définie sur 1 si le bouton est sélectionné, sinon 0. Vous pouvez modifier ces valeurs à l’aide des options onvalue et offvalue.
c = Checkbutton(gui, text="Ma CheckBox", variable=var, onvalue = 1, offvalue = 0)
Pour savoir si la case est cochée ou non, il suffit d’exécuter l’instruction :
v.get () # égal à 1 si la case est cochée, 0 sinon
Pour cocher et décocher la case, il faut utiliser les instructions suivantes :
case.select () # pour cocher case.deselect () # pour décocher
Il est possible d’associer du texte à l’objet case à cocher :
case.config (text = "case à cocher")
2.5 Le contrôle bouton radio
20
Le Radiobutton est un widget Tkinter standard utilisé pour implémenter un bouton à choix multiples.
La syntaxe est la suivante :
btn = Radiobutton ( master, option = value, ... )
Où: master : Cela représente la fenêtre parent. option : Voir ci-dessous la liste des options les plus utilisées
Tableau de quelques options pour le widget Checkbutton
Option
Description
bd bg fg font height
justify
width
value
Largeur de bordure en pixels. La valeur par défaut est 2. Couleur de fond normale. Couleur normale du premier plan (texte). Police de texte à utiliser pour l’étiquette du radiobutton. Le nombre de lignes de texte (pas de pixels) sur le bouton radio. La valeur par défaut est 1. •LEFT pour justifier le texte à gauche de chaque ligne; •CENTER pour centrer le texte; •RIGHT pour justifier le texte à droite. Largeur du bouton en lettres (si du texte) ou en pixels (si une image). Lorsqu’un bouton radio est activé par l’utilisateur, sa variable de contrôle est définie sur sa valeur actuelle. Si la variable de contrôle est un StringVar, on donne à chaque bouton radio du groupe une valeur de type String. Si la variable de contrôle est un IntVar, on donne à chaque radiobutton une valeur entière.
Exemple :
21
from tkinter import *
def sel():
ch = "Vous avez sélectionné : " + v.get()
mess.config(text = ch)
gui = Tk()
v = StringVar()
v.set("Python") # initialiser
Avant sélection d’un choix
r1 = Radiobutton(gui, text="Python", variable=v, value="Python", command=sel)
Après sélection d’un choix
r1.pack(anchor = W) #positionner le widget selon la direction donnée
r2 = Radiobutton(gui, text="Java", variable=v, value="Java", command=sel)
r2.pack(anchor = W)
r3 = Radiobutton(gui, text="PHP", variable=v, value="PHP", command=sel)
r3.pack(anchor = W)
mess = Label()
mess.pack()
gui.mainloop()
2.6 Le contrôle liste
22
Le widget Listbox est utilisé pour afficher une liste d’éléments à partir de laquelle un utilisateur peut sélectionner un certain nombre d’éléments.
La syntaxe est la suivante :
liste = Listbox ( master, option = value, ... )
Tableau de quelques options
option : Voir ci-dessous la liste des options les plus utilisées
Où: master : Cela représente la fenêtre parent.
Option
bd bg fg font height width
selectmode
Description Largeur de bordure en pixels. La valeur par défaut est 2. Couleur de fond normale. Couleur normale du premier plan (texte). Police de texte à utiliser pour la liste. Nombre de lignes (pas de pixels!) Affichées dans la zone de liste. La valeur par défaut est 10. La largeur du widget en caractères. La valeur par défaut est 20. Détermine le nombre d’éléments pouvant être sélectionnés et la manière dont les éléments sont sélectionnés: •BROWSE: on peut sélectionner qu’une seule ligne dans la liste. Si on clique sur un élément, puis on fait glisser vers une autre ligne, la sélection suivra la souris. C’est la valeur par défaut. •SINGLE: on peut sélectionner qu’une seule ligne et on ne peut pas faire glisser la souris. •MULTIPLE :on peut sélectionner n’importe quel nombre de lignes à la fois. Le clic sur une ligne permet de choisir si elle est sélectionnée ou non. •EXTENDED: on peut sélectionner n’importe quel groupe de lignes adjacentes à la fois en cliquant sur la première ligne et en faisant glisser jusqu’à la dernière ligne.
23
Voici les méthodes les plus utilisées pour ce widget:
Méthode activate(index)
curselection()
delete(first, last=None)
get(first, last=None)
index(i)
insert(index, *elements)
nearest(y) see(index) size()
Description Sélectionne la ligne spécifiée par l’index donné. Renvoie un tuple contenant les numéros de ligne du ou des éléments sélectionnés, en comptant à partir de 0. Si rien n’est sélectionné, retourne un tuple vide. Supprime les lignes dont les indices sont dans la plage [first, last]. Si le deuxième argument est omis, la ligne avec l’index first est supprimée. Renvoie un tuple contenant le texte des lignes dont les indices sont dans la plage [first, last], last est inclus. Si le deuxième argument est omis, retourne le texte de la ligne la plus proche du premier. Positionne la partie visible de la liste de sorte que la ligne contenant l’index i soit en haut du widget. Insérez une ou plusieurs nouvelles lignes dans la liste avant la ligne spécifiée par index. Utilisez END comme premier argument si vous souhaitez ajouter de nouvelles lignes à la fin de la liste. Renvoie l’index de la ligne visible la plus proche de la coordonnée y. Ajustez la position de la liste afin que la ligne référencée par l’index soit visible. Renvoie le nombre de lignes dans la liste.
Exemple :
24
from tkinter import *
gui = Tk()
liste = Listbox(gui)
liste.insert(1, "Blue")
liste.insert(2, "Red")
liste.insert(3, "Green")
liste.insert(4, "Yellow")
liste.insert(5, "Orange")
liste.insert(6, "Black")
liste.pack()
gui.mainloop()
Récupération des éléments de la liste :
for i in range (0, liste.size()):
print(liste.get (i))
Blue Red Green Yellow Orange Black
2.7 Le contrôle liste avec barre de défilement Combobox
25
C’est une liste avec une barre de défilement incluse.
Exemple :
import tkinter import tkinter.ttk as ttk
root = tkinter.Tk()
o =ttk.Combobox(root, values=["ligne 1", "ligne 2", "ligne3", "ligne4"]) o.pack ()
def print_file () : print(o.get())
b = tkinter.Button (root, text="print") b.config (command = print_file) b.pack ()
root.mainloop()
2.8 Le contrôle bouton
26
Voici la syntaxe pour créer ce widget:
btn = Button ( master, option = value, ... )
Où: master : Cela représente la fenêtre parent.
option : Voir ci-dessous la liste des options les plus utilisées
Tableau de quelques options
Méthode
bd bg command fg font
height
highlightcolor image
justify
state
width
Description
Largeur de bordure en pixels. La valeur par défaut est 2. Couleur de fond normale. Fonction ou méthode à appeler lorsqu’on clique sur le bouton. Couleur normale du premier plan (texte). Police de texte à utiliser pour l’étiquette du bouton. Hauteur du bouton selon les lignes de texte (pour les boutons textuels) ou en pixels (pour les images). La couleur du focus lorsque le widget a le focus. Image à afficher sur le bouton (au lieu du texte). •LEFT pour justifier le texte à gauche de chaque ligne; •CENTER pour centrer le texte; •RIGHT pour justifier le texte à droite. Définissez cette option sur DISABLED pour griser le bouton et le désactiver. La valeur ACTIVE lorsque la souris est dessus. La valeur par défaut est NORMAL. Largeur du bouton selon les lettres (si du texte) ou en pixels (si une image).
27
Exemple :
from tkinter import * from tkinter import messagebox
def affich():
messagebox.showinfo("Cours Python", "Bienvenue dans notre cours!")
Au clic sur « cliquez ici! »
gui = Tk() gui.geometry("200x100")
btn = Button(gui, text ="Cliquez ici!", command = affich) btn.pack()
gui.mainloop()
2.9 Le Cadre
28
▪ Un cadre Frame est un conteneur pour d’autres widgets. Il permet de réaliser des
groupes cohérents de widgets.
cadre = Frame(fenetre)
▪
Un cadre LabelFrame a les caractéristiques d’un Frame plus la possibilité d’afficher une étiquette.
from tkinter import * gui = Tk() lframe = LabelFrame(gui, text="Ceci est un LabelFrame") lframe.pack(fill="both", expand="yes")
btn = Button(lframe, text ="Cliquez ici!") btn.pack()
gui.mainloop()
2.10 Le canvas
29
c’est une surface permettant de dessiner des formes géométriques (rectangles, disques, du texte, etc) et de les manipuler (personnalisation, déplacement, suppression, etc). Ce type de widget permet de créer des jeux de toutes sortes.
monCanvas = Canvas(fenetre, width=…, height=.., bg=…, …)
Les formes géométriques sont appelés des items.
Voici les items les plus utiles qu’un canevas peut générer :
Motif géométrique
Item Tkinter
segment de droite, flèche create_line
rectangle carré cercle ellipse texte image png, gif polygone arcs de cercle, d’ellipse
create_rectangle create_oval create_text create_image create_polygon create_arc
Exemple :
from tkinter import *
root=Tk() cnv=Canvas(root, width=200, height=200, bg="silver") cnv.pack() cnv.create_rectangle((10, 20), (200, 100),fill='white') root.mainloop()
3- Gestionnaires de positionnement
30
Tous les widgets Tkinter ont accès à des méthodes de gestion de géométrie spécifiques, qui ont pour but d’organiser les widgets dans la zone de widget parent. Tkinter expose les classes de gestionnaire de positionnement suivantes: pack, grid et place.
La méthode pack() : Ce gestionnaire de positionnement organise les widgets en blocs
avant de les placer dans le widget parent.
La méthode place() : Ce gestionnaire de positionnement organise les widgets en les
plaçant dans une position spécifique dans le widget parent.
La méthode grid() : Ce gestionnaire de positionnement organise les widgets dans une
structure semblable à une table dans le widget parent.
3-1 La méthode pack
31
Cette méthode empile les objets les uns à la suite des autres. Par défaut, elle les empile les uns en dessous des autres. L’exemple suivant produit l’empilement des objets.
import tkinter from tkinter import messagebox gui = tkinter.Tk() l = tkinter.Label (text = "première ligne") l.pack () s = tkinter.Entry () s.pack () e = tkinter.Label (text = "seconde ligne") e.pack () gui.mainloop()
Les objets sont empilés à l’aide de la méthode pack les uns en dessous des autres
On peut aussi les empiler les uns à droite des autres grâce à l’option side.
import tkinter from tkinter import messagebox gui = tkinter.Tk() l = tkinter.Label (text = "première ligne") l.pack (side = tkinter.RIGHT) s = tkinter.Entry () s.pack (side = tkinter.RIGHT) e = tkinter.Label (text = "seconde ligne") e.pack (side = tkinter.RIGHT) gui.mainloop()
32
La méthode pack possède trois options :
▪side à choisir entre tkinter.TOP (valeur par défaut), tkinter.LEFT , tkinter.BOTTOM , tkinter.RIGHT
▪expand : égale à True ou False (valeur par défaut), si cette option est vraie, l’objet occupe tout l’espace.
▪fill : égale à None (valeur par défaut), X, Y, BOTH, l’objet s’étend selon un axe (X ou Y ou les deux).
Remarque :
Lorsqu’un objet n’est plus nécessaire, il est possible de le faire disparaître en appelant la méthode pack_forget
s.pack_forget()
3-2 La méthode grid
33
La méthode grid suppose que la fenêtre qui les contient est organisée selon une grille (matrice) dont chaque case peut recevoir un objet. Le coin supérieur gauche a la valeur de ligne 0 et la valeur de colonne 0.
➢ La méthode grid possède plusieurs options, parmi lesquelles: •column : colonne dans laquelle sera placée l’objet. •columnspan : nombre de colonnes que doit occuper l’objet. •row : ligne dans laquelle sera placée l’objet. •rowspan : nombre de lignes que doit occuper l’objet. •padx : Marge externe horizontale. •pady : Marge externe verticale. •sticky = position
➢ La méthode grid_forget qui permet de faire disparaître les objets.
s.grid_forget() # disparition
from tkinter import * root = Tk() root.title("profile") root.config(bg="lightgrey")
34
Photo de profile image = PhotoImage(file="profile.png") small_img = image.subsample(4,4) #Renvoie un échantillon qui n'utilise que chaque Xe ou Ye pixel img = Label(root, image=small_img) img.grid(row=0, column=0, rowspan=6, padx=5, pady=5)
titre= Label(root, text="Connexion utilisateur ", bg="lightcyan") titre.grid(row=0, column=1, columnspan=4, padx=5, pady=5)
Label(root, text="user", bg="lightgrey").grid(row=1, column=1, padx=5, pady=5, sticky=E) name = Entry(root, bd=3) name.grid(row=1, column=2, padx=5, pady=5)
Label(root, text="Password", bg="lightgrey").grid(row=3, column=1, padx=5, pady=5, sticky=E) prenom = Entry(root, bd=3) prenom.grid(row=3, column=2, padx=5, pady=5)
conn = Button(root, text="connexion!", bg="#6FAFE7", width=15) conn.grid(row=4, column=2, padx=5, pady=5) root.mainloop()
3-3 La méthode place
Publicité
35
La méthode place permet de placer chaque objet à une position définie par des coordonnées.
import tkinter from tkinter import messagebox gui = tkinter.Tk() l = tkinter.Label(text="première ligne") l.place (x=10, y=50)
gui.mainloop()
Remarque :
➢ La méthode place_forge qui permet de faire disparaître les objets.
l.place_forget() # disparition
4. Les événements
36
▪ Une application Tkinter consiste essentiellement en une boucle, déclenchée par la méthode mainloop(), scrutant les événements (events). Ces événements peuvent provenir du clavier (touche frappée, enfoncée, relâchée), de la souris (clic gauche ou droit, glisser/déplacer...) ou du programme lui-même.
▪ La détection de ces événements est automatique, il suffit de spécifier comment lier un
événement particulier à l'action qui doit lui correspondre. C'est l'objet de la méthode bind() (lier en anglais).
▪ La méthode bind permet d’exécuter une fonction lorsqu’un certain événement donné est
intercepté par un objet donné. La fonction exécutée accepte un seul paramètre de type Event qui est l’événement qui l’a déclenchée. Cette méthode a pour syntaxe :
w.bind(evt, fonction)
Où: w est l’identificateur de l’objet devant intercepter l’événement désigné par la chaîne de caractères evt dont les valeurs possibles sont décrites après. fonction est la fonction qui est appelée lorsque l’événement survient.
Remarques : - La fonction doit obligatoirement être déclarée avant son déclenchement dans le code du programme. - La fonction a obligatoirement un paramètre evt : « def fonc(evt) : » Ce dernier permet de récupérer les informations de l’événement.
37
38
Exemple :
39
from tkinter import*
def pointeur(evt):
position.configure(text="Clic détecté en X = "+str(evt.x)+", Y = "+str(evt.y))
fen=Tk()
fen.geometry("400x200" )
fond=Canvas(fen, width=200, height=150, bg="light yellow")
fond.pack()
position=Label(fen,text="Clic détecté en X =''+'','' Y = ''")
position.pack()
fen.bind("<Button-1>", pointeur)
fen.mainloop()
La méthode bind() associé à la fenêtre fen lie l’événement clic-gauche ( ) à la fonction 'pointeur'. Celle ci récupère les coordonnées de l'objet evt par les instructions evt.x et evt.y
Module 12:
Le module Numpy
1. Présentation
41
Il existe de nombreux modules scientifiques sous Python :
• NumPy ( Numerical Python) : est une bibliothèque open source associée au langage Python, créée
spécialement pour le calcul scientifique, notamment le calcul matriciel.
Documentation officielle : https://numpy.org/doc/
• SciPy : fonctions mathématiques puissantes s'appliquant aux tableaux générés par NumPy. C'est la boîte à
outil numérique pour les tableaux NumPy. Elle contient des opérations spécifiques (algèbre linéaire, statistique…) de manipulation de tableaux, de plus haut niveau que celles de NumPy ;
• matplotlib : permet le tracé de graphes de fonctions.
1. Présentation
NumPy est un package du langage Python destiné à manipuler des tableaux (vecteurs
et matrices).
Ce package fournit de multiples fonctions:
• Pour un accès rapide aux données (ex. extraction, recherche)
• Pour les calculs mathématiques, statistiques et logiques (ex. sum, min, max, sort)
• Pour l’intégration de C/C++.
Les tableaux Numpy sont plus performants (rapidité, gestion de la volumétrie) que les
collections usuelles de Python (les Listes)
Les tableaux Numpy sont au cœur de presque tout l'écosystème de data science en
Python.
Les différentes dimensions sont appelées des axes,
tandis que le nombre de
dimensions ( 0 pour un scalaire, 1 pour un vecteur, 2 pour une matrice, etc) est appelé
rang.
42
import numpy as np
pour importer le module numpy
43
Différence entre les listes et les tableaux array
Un tableau ressemble beaucoup à une liste, avec ces avantages:
Un tableau a une taille fixée lors de sa création.
Tous les éléments d’un tableau doivent être du même type (lui aussi fixé à la création).
Vite
Pratique
Moins de mémoire
2. Créer un tableau
Fonction
Rôle
Exemple
array(object, dtype, …)
Créer un tableau numpy
import numpy as np a= np.array([1, 2, 5, 3]) mat = np.array([ [3.2, 7, 9], [4, 8.75, 0] ])
zeros(shape, dtype, …)
Retourne un nouveau tableau rempli de zéros. Le type de données par défaut est numpy.float64
v = np.zeros(5) print(v) m = np.zeros(shape=(3,3), dtype=int) m= np.zeros((3,3), int)
ones(shape, dtype, …)
Retourne un nouveau tableau rempli de nombre à virgule flottante de valeur 1
m = np.ones(shape=(3,5)) np.ones(shape=(3,5), dtype=int) [[1 1 1 1 1] [1 1 1 1 1] [1 1 1 1 1]]
full(shape, full_value, …) Retourne un nouveau tableau rempli avec la valeur donnée.
Un tableau 42 rempli de la valeur 3.14 np.full((4,2),3.14)
identity( n , dtype = Aucun )
44
Retourne un tableau d'identité. Avec n Nombre de lignes et dtype le type de données de la sortie. La valeur par défaut est float.
np.identity(3) array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
Fonction
Rôle
Exemple
arange(debut, fin, pas, …)
▪
▪
génère un tableau à une dimension formé d’entiers ou de flottants (Contrairement à la fonction range), commençant à debut, et finissant à fin (valeur exclue), avec un pas. La taille de « step » par défaut est 1.
np.arange(start=1, stop=10)
np.arange(0, 20, 2).reshape(2,5)
linspace(debut, fin, num, …)
Renvoie des nombres régulièrement espacés sur un intervalle spécifié.
np.linspace(start=0, stop=10,num=5)
random.randint(low, high, size, …) Renvoie des entiers aléatoires dans
np.random.randint(10,100,5)
[`low`, `high`[. Si `high` est nul, alors les résultats proviennent de [0, `low`[.
np.random.randint(10, size=(2,2))
random.uniform(low, high, size, …)
Retourne des réels aléatoires dans [`low`, `high`[.
np.random.uniform(2, 5, size=3)
random.random(size)
Retourne des réels aléatoires dans [0.0, 1.0[
np.random.random(2)
45
Création à partir d’un autre objet
46
Conversion à partir d’un fichier
Les données peuvent être stockées dans un fichier texte :
▪loadtxt pour charger, ▪savetxt pour sauver
import numpy as np #charger à partir d'un fichier #typage explicite possible m = np.loadtxt("vecteur.txt",dtype=float) print(m)
#[[ 1. 12. 14. 17. 15. 5. 6.5 10.5]
n = np.loadtxt("vecteur.txt",dtype=int) print(n) #[ 1 12 14 17 15 5 6 10]
Conversion d’une collection (type standard Python)
#liste de valeurs lst = [1.2,3.1,4.5] print(type(lst)) # <class " list " > #conversion à partir d'une liste a = np.asarray(lst,dtype=float) print(type(a)) # <class " numpy.ndarray " > print(a) # [1.2 3.1 4.5]
Exemple 1: Fichier texte
Exemple 2: Fichier csv
47
3. Caractéristiques d’un tableau
Fonction/Attribut
Rôle
Type(tableau)
Retourne le type de la structure
Exemple:
tableau.dtype
tableau.ndim
tableau.size
tableau.shape
Retourne le type d’éléments du tableau
Retourne le nombre des dimensions du tableau
Retourne le nombre d’éléments du tableau
Retourne le nombre des lignes et des colonnes du tableau
48
3. Accéder aux éléments d’un tableau
v
Indice(positif)
Indice(négatif )
i
0
1
2
3
j
-4
-3
-2
-1
m
1
0
-4
0
-4
1
5
9
13
2
1
-3
1
-3
2
6
10
14
3
2
-2
2
-2
3
7
11
15
Publicité
4
3
-1
3
-1
4
8
12
16
n
▪ Pour les vecteurs, accéder à un élément d'indice i en utilisant la syntaxe:
tableau[ i ]
▪ Pour les matrices, accéder à l’élément d’indice i,j en utilisant la syntaxe :
tableau [ i , j ] ou tableau [ i ] [ j ]
▪ Pour accéder aux éléments d’un tableau en utilisant la syntaxe:
tableau[ lower : upper : step ] ; [lower, upper[
Lorsque les valeurs (lower,upper,step) ne sont pas précisés, les valeurs
attribuées par défauts sont (premier élément, dernier élément, 1 ou -1).
import numpy as np m = np.arange(1,17).reshape(4,4) print(m[0,0]) # 1 print(m[-1,-1]) #16 n=m[1:3,2:4] print(n)
49
50
4. Modification d’un tableau
Fonction/Opération
Rôle
Exemple
Le signe "="
Remplacer les valeurs d’un tableau
v=np.arange(1,5) v[1]=9 print(v) # [1, 9, 3, 4] m=np.arange(1,17).reshape(4,4) m[0] = [11, 12, 13, 14] m[1] = 100 m[:,2:4] = 77
append(arr, values, axis)
ajouter une valeur, placée en dernière position
Insert(arr, indices, values, axis)
insérer une valeur dans un tableau
m=np.arange(1,17).reshape(4,4) ligne = np.array([[17, 18, 19, 20]]) # Créer un tableau ligne (1,4) m= np.append(m, ligne, axis=0) # Ajouter une ligne à la fin col = np.array([[7],[7],[7],[7],[7]]) # Créer un tableau col (5,1) m=np.append(m, col, axis = 1) # ajouter une colonne à la fin
m=np.arange(1,17).reshape(4,4) m=np.insert(m,1, [[0,0,0,0]],axis=0) # insérer une ligne à l’indice 1 # insérer deux lignes aux indices respectifs 2 et 3 m = np.insert(m, [2,3],[[5,55],[5,55],[5,55],[5,55] ,[5,55]],axis=1)
51
Fonction/Opération
Rôle
Exemple
delete(arr,indices,axis)
Supprimer via indice
v = np.array([1.2,2.5,3.2,1.8]) # une plage d’indices est possible v = np.delete(v,2)
resize(arr, new_shape)
Redimensionner un tableau, 1 valeur pour vecteur, couple de valeurs pour matrice
m = np.ones(shape=(2,2)) m=np.resize(m,(3,3))
concatenate((a1,a2,..,an), axis) Concaténer une séquence de tableaux le
long d'un axe existant. Si les tableaux sont de dimension > 1, on peut utiliser vstack (vertical) ou hstack (horizontal)
52
m=np.random.randint(0,101,(2,5)) m=np.resize(m,(2,6))
a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) np.concatenate((a, b), axis=0)
4. Copie d’un tableau
Exemple 1:
Exemple 2:
Remarque:
Avec l'opérateur = on ne copie pas vraiment le tableau, c'est plutôt comme un même tableau avec deux noms.
Pour copier un tableau, une solution simple est d'utiliser la fonction copy()
53
5. Tri ,recherche et extraction
Fonction
Rôle
Exemple
sort(arr, axis, kind, …) Renvoie une copie triée d'un
tableau.
a = np.array([[1,5,4],[3,2,1]]) # trier les lignes (axis = 0) pour chaque colonne np.sort(a, axis=0) # trier le tableau aplati np.sort(a,axis=None)
argsort(arr, axis, …)
Renvoie les indices des élements triés
A = np.array([1, 3, -2, 5]) np.argsort(A)
where(condition)
Renvoie les index où une condition donnée est True.
v = np.array([1, 7, 4, -3, 6, 7]) np.where(v==7)
max(arr, axis, ….)
Renvoie la valeur maximal (L’équivalent existe pour min )
a = np.array([[1,4],[3,9]]) np.max(a)
argmax(arr, axis, ….)
Renvoie l’indice de valeur maximal (L’équivalent existe pour min )
54
a = np.array([[6,4],[3,9]]) # recherche indice de valeur max des lignes (axis = 0) pour chaque colonne np.argmax(a, axis=0)
Fonction
Rôle
Exemple
argpartition(a,k)
extract(condition,a)
55
La fonction est utilisée pour créer une copie partitionnée indirecte du tableau a avec ses éléments réorganisés de telle manière que la valeur de l'élément en k-ième position soit à la position qu'elle serait dans un tableau trié. Tous les éléments plus petits que le k- ème élément sont déplacés avant cet élément et tous égaux ou supérieurs sont déplacés derrière lui. L'ordre de tous les éléments dans les partitions n'est pas défini.
est utilisée pour extraire des éléments spécifiques d’un tableau basé sur une certaine condition. Avec extract(), on peut aussi utiliser des conditions comme and et or.
x = np.array([12, 10, 12, 0, 6, 8, 9, 1, 16, 4, 6, 0]) index_val = np.argpartition(x, -4)[-4:] print(index_val) # [1, 0, 2, 8] print(np.sort(x[index_val])) # [10, 12, 12, 16]
0
12
1
10
2
12
3
0
4
6
5
8
6
9
7
1
8
16
3
11
7
9
4
10
5
6
1
9
4
0
10
6
11
0
2
8
a = np.array([1, 7, 3, 13, 6,11,16,19]) cond = np.mod(a, 2)==1 print(cond) #[True True True True False True False True] # Utiliser extract() pour obtenir les valeurs res1=np.extract(cond, a) print(res1) #[ 1 7 3 13 11 19] # Appliquer directement la condition sur extract() res2=np.extract(((a < 5) | (a > 15)), a) print(res2) #[ 1 3 16 19]
6. Opérateurs arithmétiques
Opérateur
Syntaxe
Exemple
Addition
Soustraction
Multiplication
Division
Puissance
Division entière
+
_
*
/
**
//
a=np.arange([5,1,-2, 3]) b=a+4
a=np.arange(4) b=np.arange(4,9) c=b-a
a=np.random.randint(0,100,(3,3))
[[25 31 28] [31 3 69] [40 61 51]]
b=np.zeros((3,3))
c=a*b
np.array([17,8,12.5])/10
np.array([1,2,4,8])**2
np.array([10,17])//np.array([5,11])
Reste de la division entière %
np.array([10,17])%np.array([5,11])
Produit matricielle
dot(a,b)
56
a = [[1, 0], [0, 2]] b = [[4, 1], [2, 2]] np.dot(a, b)
[[4 1] [4 4]]
Exemple:
7. Opérateurs et fonctions logiques
Fonction
Description
greater()
Supérieur à
greater_equal()
Supérieur ou égal à
less()
Inférieur à
less_equal()
Inférieur ou égal à
equal()
Egal à
not_equal()
Différent de
logical_and()
Et logique
logical_or()
Ou logique
Logical_xor
Xor logique
57
Activité:
1) Créer un tableau t qui contient les éléments suivants.
2) Trouver les éléments de t compris entre 10 et 20