L'objectif de ce cours est de se familiariser avec la programmation par objets (Object Oriented Programming en Anglais). Il s'appuie sur le langage de programmation Python déjà utilisé dans l'initiation à la programmation (nous supposons que les notions de bases en sont acquises, n'hésitez pas à vous reporter au support de cours pour les réviser). Comme au semestre précédent, vous utiliserez le logiciel IDLE pour éditer et exécuter les scripts que vous aurez créés.
Nous nous appuyons sur plusieurs supports existants, notamment un tutoriel en Français, que l'on peut aussi trouver sur ce site. Mais il existe d'autres ressources en Français sur Python, comme ce site ou cet autre tutoriel en ligne. N'hésitez pas à parcourir ces documents.
Ce cours se compose de 13 séances de 3h, partagées entre cours théoriques et TD sur machine.
Le cours est une introduction générale à la programmation par objets. Les exercices proposés sont destinés à se familiariser avec les méthodes et les constructeurs qui ont été vus en cours. Le support du cours est téléchargeable ici.
Personne
, avec les champs nom
et prenom
, et son constructeur. Ajoutez une méthode afficher
qui utilise la méthode print
pour afficher le nom et le prénom d'une personne.
from Personne import *
doit être ajouté au début du fichier).
p = Personne("nom", "prenom")
et appelez la méthode afficher
(p.afficher("nom", "prenom")
). Sauvegardez et lancez le fichier "td1.py" (menu Rum, bouton Run Module).
p1
, p2
et p3
. Mettez-les dans une liste. Utilisez une boucle for
qui parcourt la liste et appelle pour chaque personne la méthode afficher
. Sauvegardez et lancez le fichier "td1.py" (menu Rum, bouton Run Module).
Compte
avec les champs solde
, et titulaire
, ce dernier étant une instance de la classe Personne
. Ajoutez un constructeur à votre classe. Un compte sera toujours créé avec un solde nul.
afficher
qui appelle la fonction print
pour afficher le solde.
afficher
du compte. Sauvegardez et lancez le fichier "td1.py".
déposer(x)
(resp. une méthode retirer(x)
) qui crédite (resp. qui débite) de x le solde du compte.
déposer(x)
. Appelez la méthode afficher
du compte. Débitez le compte avec la méthode retirer(x)
. Appelez la méthode afficher
du compte. Sauvegardez et lancez le fichier "td1.py".
retirer(x)
afin qu'elle affiche un message d'erreur si le solde est inférieur à la valeur passée en paramètre. Si c'est le cas, le compte ne doit pas être débité.
Nous approfondissons les notions d'héritage et de sous classe. Si vous ne maîtrisez pas encore la notion de classe, reprenez le TD de la première séance. Un corrigé est disponible ci-dessus.
Le support du cours est téléchargeable ici.
Etudiant
(resp. Salarie
) de la classe Personne
, avec le champ etablissement
(resp. salaire
). Définissez aussi les constructeurs des classes Etudiant
et Salarie
.
afficher
qui appelle la méthode afficher
de la classe Personne
et qui affiche le champ spécifique à la sous classe.
p1
, p2
, p3
, telles que p2
est un étudiant et p3
un salarié. Mettez-les dans une liste. Utilisez une boucle for
qui parcourt la liste et appelle pour chaque personne la méthode afficher
. Sauvegardez et lancez le fichier "td2.py".
LivretA
de la classe Compte
. Définissez aussi son constructeur.
retirer
de la classe Compte
, celle-ci se contentera de retirer l'argent quelque soit le solde du compte.
LivretA
, ajoutez une méthode retirer
. Celle-ci vérifie que le solde est supérieur ou égal à la somme passée en paramètre. Si c'est le cas, elle appelle la méthode retirer
de Compte
. Sinon elle indique à l'utilisateur que le solde du compte est insuffisant pour effectuer la transaction.
retirer
de la classe LivretA
.
LivretA
, ajoutez une méthode interets
qui calcule et ajoute au solde les intérêts d'une année (solde = solde + solde * 1,25%).
interets
de la classe LivretA
.
Courant
de la classe Compte
. Définissez aussi son constructeur.
Courant
, ajoutez une méthode retirer
. Celle-ci appelle la méthode retirer
de Compte
puis appelle une méthode agios
de Courant
.
Courant
, définissez la méthode agios
. Si le solde est inférieur à 0 :
solde = solde + 16% * solde
),
Courant
.
Nous revenons sur le déroulement d'un programme à base d'objets, selon la méthode des traces d'exécution vue au premier semestre. Le support du cours est téléchargeable ici.
Personne
, une instance de la classe Etudiant
et une instance de la classe Salarie
. Pour chacune de ces instances, appelez la méthode afficher
. Lancez votre programme.
pers
de la classe Personne
. Créez une instance c
de la classe Courant
(avec pers
comme titulaire). Déposez 1000 sur ce compte. Retirez 100 euros. Retirez 1500 euros. Appelez la méthode afficher. Lancez votre programme.
l
de la classe LivretA
(avec pers
comme titulaire). Déposez 1000 sur ce compte. Retirez 100 euros. Retirez 1500 euros. Appelez la méthode afficher. Lancez votre programme.
Cette semaine a lieu le premier devoir de contrôle continu. Il porte sur les cours et les TD des trois premières séances : classes (constructeurs, méthodes, instances), héritage (sous-classes) et traces d'exécution.
Nous nous intéresserons ensuite aux fonctions paramétrées avec des valeurs par défaut. Puis nous reviendrons sur l'utilisation des chaines de caractères.
Le support du cours est téléchargeable ici.
Compte
, Courant
et LivretA
de façon à ce qu'ils prennent une valeur pour self.solde
en paramètre.
Compte
et Courant
, 500 pour la classe LivretA
.
l1
de la classe LivretA
(avec pers
comme titulaire et 2000 comme solde). Créez aussi une instance l2
de la classe LivretA
(avec pers
comme titulaire et rien comme solde).
afficher
pour l1
et l2
. Lancez votre programme.
Les chaines de caractères sont, en Python, des objets prédéfinis, comme en témoigne les méthodes permettant de les manipuler, comme split ou join.
Personne
, Etudiant
et Salarie
de façon à ce qu'ils prennent, au lieu d'un paramètre pour le nom et un paramètre pour le prénom, un seul paramètre correspondant à la même chaine de caractères que celle obtenue par la méthode afficher
(par exemple, ils pourront prendre en paramètre la chaine de caractères "Sallaberry Arnaud" au lieu des deux chaines "Sallaberry" et "Arnaud").
Personne
pour remplir les champs self.nom
et self.prenom
en découpant la chaine prise en paramètre (utilisez split
).
Personne
pour remplir les champs self.nom
et self.prenom
en découpant la chaine prise en paramètre.
Compte
, LivretA
et Courant
pour qu'ils prennent en paramètre, au lieu d'une instance de la classe Personne
, deux chaines de caractères (par exemple "Sallaberry" et "Arnaud")
Personne
pour remplir le champ self.titulaire
de Compte
. Utilisez pour cela la fonction join
.
afficher
de la classe Personne
pour qu'elle affiche, en plus du nom et du prénom, les initiales de la personne.
afficher
.
Nous allons voir comment on peut créer des dessins grâce à la classe Turtle
.
Le support de cours est téléchargeable ici.
Dessin
.
self.t
avec une instance de la classe Turtle
.
trait
qui utilise self.t pour dessiner un trait. Cette méthode prend 4 paramètres :
Dessin
.
cercle
de la classe Dessin
qui utilise self.t pour dessiner un cercle. Cette méthode prend 3 paramètres :
rectangle
de la classe Dessin
qui utilise self.t pour dessiner un rectangle. Cette méthode prend 4 paramètres :
carre
de la classe Dessin
qui appelle la méthode rectangle
pour dessiner un carré. Cette méthode prend 3 paramètres :
hexagone
de la classe Dessin
qui utilise self.t pour dessiner un hexagone. Cette méthode prend 3 paramètres :
Dessin
, re-créez le dessin ci-dessous.
Nous allons maintenant demander à l'utilisateur de spécifier des paramètres pour dessiner un rectangle.
rectangleUtilisateur
de la classe Dessin
qui ne prend pas de paramètres.
input
pour demander 4 valeurs à l'utilisateur. Attention : input récupère des valeurs sous forme de chaines de caractères. Il va donc falloir les transformer en entier (int(valeur)
) pour les utiliser avec la tortue.
rectangleUtilisateur
appelez la méthode rectangle
pour dessiner le rectangle en fonction des données saisies.
rectangleUtilisateur
.
Cette séance est consacrée aux modèles d'interaction à base d'objets.
Les fonctions graphiques ont 2 finalités : le dessin et l'interaction. L'interaction est le rôle de la classe Tk, dont le chargement se fait par from Tkinter import *
.
Le support de cours est téléchargeable ici.
interface
de la classe Tk
.
self.titre
contenant un Widget
de type Label
. Il aura pour texte "Gestionnaire de personnes"
interface
et lancez votre programme.
interface
, ajoutez un champ self.labelNom
contenant un Widget
de type Label
avec pour texte "Nom : ".
self.zoneNom
contenant un Widget
de type Entry
.
interface
, ajoutez un champ self.boutonAjouter
contenant un Widget
de type Button
avec pour texte "Ajouter". Il appelle la méthode ajouter
.
ajouter
qui affiche (print) "Je rentre bien dans la méthode lorsque je clique".
ajouter
.
ajouter
, récupérez les valeurs saisies dans les champs self.zoneNom, self.zonePrenom, self.zoneEtablissement, self.zoneSalaire (par exemple, mettez dans des variables n, p, e et s).
ajouter
, si la variable contenant l'établissement n'est pas vide, ajoutez une variable labelPersonne
contenant un Widget
de type Label
avec pour texte ("Etudiant : "+n+" "+p+" "+e").
labelPersonne
contenant un Widget
de type Label
avec pour texte ("Salaire : "+n+" "+p+" "+s").
labelPersonne
contenant un Widget
de type Label
avec pour texte ("Personne : "+n+" "+p).
initZones
qui supprime les valeurs saisies par l'utilisateur de tous les champs de saisie.
initZones
à la fin de la méthode ajouter
.
Cette séance est de nouveau consacrée aux modèles d'interaction à base d'objets. Nous nous intéresserons plus particulièrement aux Widget
Frame
et Radiobutton
.
Le support du cours est téléchargeable ici.
Personne
ainsi que ses sous-classes Etudiant
et Salarie
.
interface
.
listePersonnes
contenant un tableau de personnes.
ajouter
, remplissez ce tableau avec des instances de Personne
, Etudiant
ou Salarie
selon les textes saisis par l'utilisateur.
initFrameCreationPersonnes
.
frameCreationPersonnes
contenant un Widget
de type Frame
.
Frame
à droite, à 10 pixels des bords de la fenêtre.
Widgets
déclarés dans le constructeur et déclarez-les dans la méthode initFrameCreationPersonnes
.
Frame
frameCreationPersonnes
.
initFrameAfficherPersonnes
.
frameAfficherPersonnes
contenant un Widget
de type Frame
.
Frame
à gauche, à 10 pixels des bords de la fenêtre.
frameAfficherPersonnes
, ajoutez un Widget
de type Label
ayant pour texte Personnes enregistrees
.
ajouter
pour que les personnes s'affichent dans la Frame
frameAfficherPersonnes
.
personneSelectionnee
de type IntVar
.
ajouter
, remplacez les Label
par des Widgets
de type Radiobutton
. Il auront pour text
le texte qui apparaissait précédemment dans le Label
, pour parent la Frame
frameAfficherPersonnes
et pour variable le champ personneSelectionnee
. La value
correspondra à l'indice de la personne dans le tableau listePersonnes
.
command
à vos boutons radios. Celle-ci permet d'appeler une méthode selectionner
de votre classe interface
.
selectionner
. Elle appelle la méthode afficher
de la personne sélectionnée.
Cette séance est de nouveau consacrée aux modèles d'interaction à base d'objets. Nous allons revoir les éléments graphiques étudiés lors des deux dernières séances.
interface
, définissez une méthode initFrameCreationCompte
.
frameCreationCompte
contenant un Widget
de type Frame
.
Frame
en bas à droite, à 10 pixels des bords de la fenêtre.
Widget
de type Label
ayant pour texte Gestionnaire de comptes
.
zoneSolde
contenant un Widget
de type Entry
.
Compte
.
interface
.
listeComptes
contenant un tableau vide.
initFrameCreationCompte
ajoutez un champ boutonAjouterCompte
contenant un Widget
de type Button
. Ce bouton a pour parent frameCreationCompte
, pour texte "Ajouter" et pour commande la méthode ajouterCompte
.
ajouterCompte
qui ajoute au tableau listeComptes
une instance de Compte
. Son solde sera la valeur saisie par l'utilisateur dans le champ zoneSolde
, son titulaire sera la personne sélectionnée grâce aux boutons radios.
delete
du widget
zoneSolde
.
initFrameAfficherComptes
.
frameAfficherComptes
contenant un Widget
de type Frame
.
Frame
en bas à gauche, à 10 pixels des bords de la fenêtre.
frameAfficherComptes
, ajoutez un Widget
de type Label
ayant pour texte Comptes enregistres
.
ajouterCompte
, ajoutez un Widget
de type Label
. Son parent est frameAfficherComptes
.
Compte
, appelée grâce à l'instance de Compte
créée (cf. exercice 3).
Cette séance est de nouveau consacrée aux modèles d'interaction à base d'objets. Nous allons revoir les éléments graphiques étudiés lors des trois dernières séances et en découvrir de nouveaux.
Le support du cours est téléchargeable ici.
fenetre
de la classe Tk
. fenetre
aura pour titre "Films" et pour couleur de fond "black".
widget
de type Menu
nommé menubar
ayant pour parent fenetre
. Utilisez la méthode config
de la classe Tk
pour que menubar
soit le menu de l'instance fenetre
de Tk
.
widget
de type Menu
nommé menufichier
ayant pour parent menubar
. Il faut aussi ajouter menufichier
en cascade à menubar
.
menufichier
une commande dont le label
est "Ouvrir" et la command
est une fonction ouvrir
.
ouvrir
qui affiche dans le shell python "Bonjour".
menufichier
un séparateur.
menufichier
une commande dont le label
est "Quitter" et la command
est la fonction fenetre.destroy
.
fenetre
un widget
de type Frame
nommé frameAfficherFilms
.
frameAfficherFilms
grâce à la méthode grid
en haut à gauche, à 10 pixels des bords de la fenêtre.
ouvrir
.
ouvrir
, ouvrez une boîte de dialogue permettant de récupérer, dans une variable filename
, le nom d'un fichier de type csv.
filename
dans le shell python.
Le code ci-dessous permet de lire un fichier CSV. Le fichier est d'abord ouvert en mode lecture (première ligne). La boucle for
permet de parcourir le fichier ouvert ligne par ligne. A chaque itération de la boucle, row
contient une ligne du CSV. row
est une liste où chaque élément correspond à une colonne du fichier CSV. Dans l'exemple, pour chaque ligne, les quatre premières colonnes du fichier CSV sont affichées dans le shell python (print
).
import csv cr = csv.reader(open("monFichier.csv","r"),delimiter=";") for row in cr: print(row[0]+", "+row[1]+", "+row[2]+", "+row[3])
ouvrir
, utilisez un objet csv.reader
pour lire ligne par ligne le fichier csv.
widget
de type label
à frameAfficherFilms
contenant les informations de la ligne. N'oubliez d'appeler la méthode pack
pour afficher ce label
.
Film
et son constructeur. Ce constructeur prend 6 paramètres (t
, r
, p
, a
, g
, n
) qui permettent de remplir 6 champs (titre
, realisateur
, pays
, annee
, genre
, note
).
listeFilms
contenant un tableau vide.
ouvrir
, pour chaque ligne du fichier csv, créez une instance de la classe Film
et ajoutez cette instance au tableau listeFilms
.
listeFilms
.
Cette semaine, nous allons continuer le programme de gestion de films commencé la semaine dernière. Plus précisément, nous allons créer un Frame
permettant à l'utilisateur de saisir un nouveau film. Puis nous allons lui permettre de sauvegarder la nouvelle liste.
fenetre
un widget
de type Frame
nommé frameSaisirFilms
.
frameSaisirFilms
grâce à la méthode grid
en haut à droite, à 10 pixels des bords de la fenêtre.
frameSaisirFilms
six widgets
de type Label
("Titre : ", "Realisateur : ", "Pays : ", "Annee : ", "Genre : ", "Note : ").
widget
de type Entry
. Ces champs de saisi de texte permettront à l'utilisateur de saisir les informations pour créer un nouveau film.
Entry
, ajoutez un widget
de type Button
avec pour text
"Nouveau Film" et pour command
une fonction nouveau
.
nouveau
qui affiche le contenu des champs de saisi dans le shell python.
nouveau
, créez une instance de la classe Film
à partir des informations contenues dans les champs de saisi de texte, et ajoutez cette instance à votre liste listeFilms
.
nouveau
, ajoutez un widget
de type Label
à frameAfficherFilms
. Il aura pour text
les informations du film.
nouveau
les lignes permettant de "vider" les champs de saisie (méthode delete
de la classe Entry
).
menuFichier
, juste après le bouton "Ouvrir" ajoutez un bouton ayant pour label
"Enregistrer sous" et pour command
une fonction enregistrerSous
.
enregistrerSous
qui affiche quelques chose dans le shell python.
enregistrerSous
, ouvrez une boîte de dialogue permettant de récupérer, dans une variable filename
, un nom de fichier de type csv dans lequel sera enregistré vos films (tkinter.filedialog.asksaveasfile
, cf cours séance 9).
filename.name
pour tester.
Le code ci-dessous permet d'écrire un fichier CSV. Le fichier est d'abord ouvert en mode écriture (première ligne). Puis ensuite deux lignes sont ajoutées. Chaque ligne est ajoutée sous forme d'une liste contenant les valeurs de chaque colonne de la ligne. Dans l'exemple, A1 contiendra "1", A2 contiendra "2", A3 contiendra "3", B1 contiendra "4", B2 contiendra "5" et B3 contiendra "6".
import csv cw = csv.writer(open(filename.name, 'w'), dialect='unix', delimiter=';') cw.writerow([1,2,3]) cw.writerow([4,5,6])
enregistrerSous
, ouvrez le fichier filename.name
en mode écriture.
Film
de listFilms
, ajoutez une ligne dans le fichier csv composée de la liste retournée par une méthode intoList
de la classe Film
.
Film
, ajoutez la méthode intoList
qui retourne les champs de la classe dans un tableau.
Frame
de gauche. Il va donc falloir vider frameAfficherFilms
à chaque fois que vous chargez un nouveau fichier (dans la méthode ouvrir
). Le code ci-dessous permet de supprimer tous les widgets
contenu dans la Frame
leNomDeLaFrame
.
for w in leNomDeLaFrame.winfo_children(): w.destroy()
ouvrir
et ainsi résoudre le problème.
listeFilms
(del listeFilms[:]
).
Retour au sommaire.