Programmation par objets
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.
Contenu du cours
Ce cours se compose de 13 séances de 3h, partagées entre cours théoriques et TD sur machine.
Séance 1 (08/01/2014)
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.
Exercice 1
- Ouvrez un fichier "Personne.py". Définissez une classe
Personne
, avec les champsnom
etprenom
, et son constructeur. Ajoutez une méthodeafficher
qui utilise la méthodeprint
pour afficher le nom et le prénom d'une personne. - Ouvrez un fichier "td1.py". Importez le fichier "Personne.py" (
from Personne import *
doit être ajouté au début du fichier). - Dans le fichier "td1.py", ajoutez une personne
p = Personne("nom", "prenom")
et appelez la méthodeafficher
(p.afficher("nom", "prenom")
). Sauvegardez et lancez le fichier "td1.py" (menu Rum, bouton Run Module). - Dans le fichier "td1.py", créez trois personnes
p1
,p2
etp3
. Mettez-les dans une liste. Utilisez une bouclefor
qui parcourt la liste et appelle pour chaque personne la méthodeafficher
. Sauvegardez et lancez le fichier "td1.py" (menu Rum, bouton Run Module).
Exercice 2
- Ouvrez un fichier "Compte.py". Importez-y les éléments du fichier "Personne.py". Définissez une classe
Compte
avec les champssolde
, ettitulaire
, ce dernier étant une instance de la classePersonne
. Ajoutez un constructeur à votre classe. Un compte sera toujours créé avec un solde nul. - Définissez une méthode
afficher
qui appelle la fonctionprint
pour afficher le solde. - Dans le fichier "td1.py", ajoutez une personne et un compte pour cette personne. Appelez la méthode
afficher
du compte. Sauvegardez et lancez le fichier "td1.py".
Exercice 3
- Définissez une méthode
déposer(x)
(resp. une méthoderetirer(x)
) qui crédite (resp. qui débite) de x le solde du compte. - Dans le fichier "td1.py", créditez le compte créé dans l'exercice 2 avec la méthode
déposer(x)
. Appelez la méthodeafficher
du compte. Débitez le compte avec la méthoderetirer(x)
. Appelez la méthodeafficher
du compte. Sauvegardez et lancez le fichier "td1.py".
Exercice 4
- Améliorez la méthode
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é. - Modifiez votre fichier "td1.py" afin de tester votre nouveau code. Sauvegardez-le et lancez-le.
Séance 2 (15/01/2014)
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.
Exercice 1
- Dans votre fichier "Personne.py", définissez la sous classe
Etudiant
(resp.Salarie
) de la classePersonne
, avec le champetablissement
(resp.salaire
). Définissez aussi les constructeurs des classesEtudiant
etSalarie
. - Pour chacune de ces sous classes, définissez une méthode
afficher
qui appelle la méthodeafficher
de la classePersonne
et qui affiche le champ spécifique à la sous classe. - Vous allez maintenant tester votre code. Pour cela, créez un fichier "td2.py". Importer le fichier "Personne.py". Créez trois personnes
p1
,p2
,p3
, telles quep2
est un étudiant etp3
un salarié. Mettez-les dans une liste. Utilisez une bouclefor
qui parcourt la liste et appelle pour chaque personne la méthodeafficher
. Sauvegardez et lancez le fichier "td2.py".
Exercice 2
- Dans votre fichier "Compte.py", définissez une sous classe
LivretA
de la classeCompte
. Définissez aussi son constructeur. - Supprimez le test de la méthode
retirer
de la classeCompte
, celle-ci se contentera de retirer l'argent quelque soit le solde du compte. - Dans la classe
LivretA
, ajoutez une méthoderetirer
. 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éthoderetirer
deCompte
. Sinon elle indique à l'utilisateur que le solde du compte est insuffisant pour effectuer la transaction. - Ajoutez dans le fichier "td2.py" les lignes nécessaires au test de la méthode
retirer
de la classeLivretA
. - Dans la classe
LivretA
, ajoutez une méthodeinterets
qui calcule et ajoute au solde les intérêts d'une année (solde = solde + solde * 1,25%). - Ajoutez dans le fichier "td2.py" les lignes nécessaires au test de la méthode
interets
de la classeLivretA
.
Exercice 3
- Dans votre fichier "Compte.py", définissez une sous classe
Courant
de la classeCompte
. Définissez aussi son constructeur. - Dans la classe
Courant
, ajoutez une méthoderetirer
. Celle-ci appelle la méthoderetirer
deCompte
puis appelle une méthodeagios
deCourant
. - Toujours dans la classe
Courant
, définissez la méthodeagios
. Si le solde est inférieur à 0 :- 16% du montant du découvert sont retirés au solde (
solde = solde + 16% * solde
), - le montant des agios (16% * |solde|) est affiché.
- 16% du montant du découvert sont retirés au solde (
- Ajoutez dans le fichier "td2.py" les lignes nécessaires aux tests des méthodes de la classe
Courant
.
Séance 3 (22/01/2014)
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.
Exercice 1
- Créez un fichier "td3.py". Importez-y le fichier Personne.py. Créez dans "td3.py" une instance de la classe
Personne
, une instance de la classeEtudiant
et une instance de la classeSalarie
. Pour chacune de ces instances, appelez la méthodeafficher
. Lancez votre programme. - Sur papier, donnez la trace d'exécution de votre programme.
Exercice 2
- Dans le fichier "td3.py", importez votre fichier Compte.py. Créez une instance
pers
de la classePersonne
. Créez une instancec
de la classeCourant
(avecpers
comme titulaire). Déposez 1000 sur ce compte. Retirez 100 euros. Retirez 1500 euros. Appelez la méthode afficher. Lancez votre programme. - Sur papier, donnez la trace d'exécution de votre programme.
Exercice 3
- Dans le fichier "td3.py", créez une instance
l
de la classeLivretA
(avecpers
comme titulaire). Déposez 1000 sur ce compte. Retirez 100 euros. Retirez 1500 euros. Appelez la méthode afficher. Lancez votre programme. - Sur papier, donnez la trace d'exécution de votre programme.
Séance 4 (29/01/2014)
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.
Exercice 1 (initialement prévu lors de la séance 3)
- Complétez les constructeurs des classes
Compte
,Courant
etLivretA
de façon à ce qu'ils prennent une valeur pourself.solde
en paramètre. - Ajoutez la valeur 0 par défaut à ce paramètre pour les classes
Compte
etCourant
, 500 pour la classeLivretA
. - Créez un fichier td4.py. Dans ce fichier, créez une instance
l1
de la classeLivretA
(avecpers
comme titulaire et 2000 comme solde). Créez aussi une instancel2
de la classeLivretA
(avecpers
comme titulaire et rien comme solde). - Appelez la méthode
afficher
pourl1
etl2
. Lancez votre programme.
Exercice 2
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.
- Modifiez la définition des constructeurs des classes
Personne
,Etudiant
etSalarie
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éthodeafficher
(par exemple, ils pourront prendre en paramètre la chaine de caractères "Sallaberry Arnaud" au lieu des deux chaines "Sallaberry" et "Arnaud"). - Modifiez les affectations du constructeur de
Personne
pour remplir les champsself.nom
etself.prenom
en découpant la chaine prise en paramètre (utilisezsplit
). - Dans td4.py, testez les constructeurs modifiés.
Exercice 3
- Au lieu de prendre en paramètre une chaine de type "Sallaberry Arnaud", vous allez maintenant prendre une chaine de type "Sallaberry;Arnaud". Modifiez le constructeur de
Personne
pour remplir les champsself.nom
etself.prenom
en découpant la chaine prise en paramètre. - Dans td4.py, testez le constructeur modifié.
Exercice 4
- Modifiez les définitions des constructeurs des classes
Compte
,LivretA
etCourant
pour qu'ils prennent en paramètre, au lieu d'une instance de la classePersonne
, deux chaines de caractères (par exemple "Sallaberry" et "Arnaud") - Appelez le constructeur de
Personne
pour remplir le champself.titulaire
deCompte
. Utilisez pour cela la fonctionjoin
. - Dans td4.py, testez les constructeurs modifiés.
Exercice 5
- Modifiez la méthode
afficher
de la classePersonne
pour qu'elle affiche, en plus du nom et du prénom, les initiales de la personne. - Dans td4.py, testez la méthode
afficher
.
Séance 5 (05/02/2014)
Nous allons voir comment on peut créer des dessins grâce à la classe Turtle
.
Le support de cours est téléchargeable ici.
Exercice 1
- Dans un fichier td5.py, créez une nouvelle classe nommée
Dessin
. - Le constructeur de cette classe ne prend pas de paramètres et remplit son champ
self.t
avec une instance de la classeTurtle
. - Créez une méthode
trait
qui utilise self.t pour dessiner un trait. Cette méthode prend 4 paramètres :- x1 correspond à l'abscisse du début du trait,
- y1 correspond à l'ordonnée du début du trait,
- x2 correspond à l'abscisse de la fin du trait,
- y2 correspond à l'ordonnée de la fin du trait.
- Testez cette méthode en créant une instance de
Dessin
.
Exercice 2
- Créez une méthode
cercle
de la classeDessin
qui utilise self.t pour dessiner un cercle. Cette méthode prend 3 paramètres :- x correspond à la position en x du cercle,
- y correspond à la position en y du cercle,
- r correspond au rayon du cercle.
- Testez cette méthode.
Exercice 3
- Créez une méthode
rectangle
de la classeDessin
qui utilise self.t pour dessiner un rectangle. Cette méthode prend 4 paramètres :- x correspond à la position en x du rectangle,
- y correspond à la position en y du rectangle,
- lg correspond à la longueur du rectangle,
- lr correspond à la largeur du rectangle.
- Testez cette méthode.
- Créez une méthode
carre
de la classeDessin
qui appelle la méthoderectangle
pour dessiner un carré. Cette méthode prend 3 paramètres :- x correspond à la position en x du carré,
- y correspond à la position en y du carré,
- l correspond à la largeur du carré.
- Testez cette méthode.
Exercice 4
- Créez une méthode
hexagone
de la classeDessin
qui utilise self.t pour dessiner un hexagone. Cette méthode prend 3 paramètres :- x correspond à la position en x de l'hexagone,
- y correspond à la position en y de l'hexagone,
- r correspond au rayon de l'hexagone.
- Testez cette méthode.
Exercice 5
- En utilisant une instance de la classe
Dessin
, re-créez le dessin ci-dessous.
Exercice 6
Nous allons maintenant demander à l'utilisateur de spécifier des paramètres pour dessiner un rectangle.
- Créez une méthode
rectangleUtilisateur
de la classeDessin
qui ne prend pas de paramètres. - Dans cette méthode, utilisez
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. - Toujours dans la méthode
rectangleUtilisateur
appelez la méthoderectangle
pour dessiner le rectangle en fonction des données saisies. - Testez la méthode
rectangleUtilisateur
.
Séance 6 (12/02/2014)
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.
Exercice 1
- Dans un fichier interface.py, créez une sous-classe
interface
de la classeTk
. - Ajoutez un champ
self.titre
contenant unWidget
de typeLabel
. Il aura pour texte "Gestionnaire de personnes" - Dans un fichier td6.py, créez une instance de la classe
interface
et lancez votre programme.
Exercice 2
- Dans le constructeur de la classe
interface
, ajoutez un champself.labelNom
contenant unWidget
de typeLabel
avec pour texte "Nom : ". - Ajoutez ensuite un champ
self.zoneNom
contenant unWidget
de typeEntry
. - Lancez votre programme : vous pouvez observer qu'une zone de saisie de texte apparaît dans la fenêtre.
Exercice 3
- Comme vous l'avez fait dans l'exercice précédent, ajoutez des champs de saisie correspondant aux prénom, établissement et salaire.
- Lancez votre programme et vérifiez que tous les champs apparaissent.
Exercice 4
- Dans le constructeur de la classe
interface
, ajoutez un champself.boutonAjouter
contenant unWidget
de typeButton
avec pour texte "Ajouter". Il appelle la méthodeajouter
. - Créez une méthode
ajouter
qui affiche (print) "Je rentre bien dans la méthode lorsque je clique". - Lancez votre programme et cliquez sur le bouton pour vérifier que vous entrez bien dans la méthode
ajouter
.
Exercice 5
- Dans la méthode
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). - Affichez grâce à un print ces valeurs. Lancez le programme et vérifiez que les valeurs saisies arrivent bien dans la méthode.
Exercice 6
- Dans la méthode
ajouter
, si la variable contenant l'établissement n'est pas vide, ajoutez une variablelabelPersonne
contenant unWidget
de typeLabel
avec pour texte ("Etudiant : "+n+" "+p+" "+e"). - Sinon, si la variable contenant le salaire n'est pas vide, ajoutez une variable
labelPersonne
contenant unWidget
de typeLabel
avec pour texte ("Salaire : "+n+" "+p+" "+s"). - Sinon, ajoutez une variable
labelPersonne
contenant unWidget
de typeLabel
avec pour texte ("Personne : "+n+" "+p).
Exercice 7
- Créez une méthode
initZones
qui supprime les valeurs saisies par l'utilisateur de tous les champs de saisie. - Appelez
initZones
à la fin de la méthodeajouter
. - Testez.
Séance 7 (19/02/2014)
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.
Exercice 1
- Récupérez ce fichier contenant une classe
Personne
ainsi que ses sous-classesEtudiant
etSalarie
. - Importez ce fichier dans le fichier contenant votre classe
interface
. - Dans le constructeur, ajoutez un champ
listePersonnes
contenant un tableau de personnes. - Dans la méthode
ajouter
, remplissez ce tableau avec des instances dePersonne
,Etudiant
ouSalarie
selon les textes saisis par l'utilisateur. - Testez
Exercice 2
- Dans votre constructeur, ajoutez un titre à votre interface.
- Ajoutez aussi une couleur de fond à votre interface.
- Testez.
Exercice 3
- Définissez une méthode
initFrameCreationPersonnes
. - Appelez cette méthode dans votre constructeur.
- Dans cette méthode, ajoutez un champ
frameCreationPersonnes
contenant unWidget
de typeFrame
. - Affichez cette
Frame
à droite, à 10 pixels des bords de la fenêtre. - Supprimez les
Widgets
déclarés dans le constructeur et déclarez-les dans la méthodeinitFrameCreationPersonnes
. - Donnez-leur comme parent la
Frame
frameCreationPersonnes
. - Testez.
Exercice 4
- Définissez une méthode
initFrameAfficherPersonnes
. - Appelez cette méthode dans votre constructeur.
- Dans cette méthode, ajoutez un champs
frameAfficherPersonnes
contenant unWidget
de typeFrame
. - Affichez cette
Frame
à gauche, à 10 pixels des bords de la fenêtre. - Dans la frame
frameAfficherPersonnes
, ajoutez unWidget
de typeLabel
ayant pour textePersonnes enregistrees
. - Testez.
- Modifiez la méthode
ajouter
pour que les personnes s'affichent dans laFrame
frameAfficherPersonnes
. - Testez.
Exercice 5
- Ajoutez dans le constructeur un champ
personneSelectionnee
de typeIntVar
. - Dans la méthode
ajouter
, remplacez lesLabel
par desWidgets
de typeRadiobutton
. Il auront pourtext
le texte qui apparaissait précédemment dans leLabel
, pour parent laFrame
frameAfficherPersonnes
et pour variable le champpersonneSelectionnee
. Lavalue
correspondra à l'indice de la personne dans le tableaulistePersonnes
. - Testez.
- Ajoutez une
command
à vos boutons radios. Celle-ci permet d'appeler une méthodeselectionner
de votre classeinterface
. - Ajoutez la méthode
selectionner
. Elle appelle la méthodeafficher
de la personne sélectionnée. - Testez.
Séance 8 (26/02/2014)
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.
Exercice 1
- Dans votre classe
interface
, définissez une méthodeinitFrameCreationCompte
. - Appelez cette méthode dans votre constructeur.
- Dans cette méthode, ajoutez un champ
frameCreationCompte
contenant unWidget
de typeFrame
. - Affichez cette
Frame
en bas à droite, à 10 pixels des bords de la fenêtre. - Dans cette frame, ajoutez un
Widget
de typeLabel
ayant pour texteGestionnaire de comptes
. - Ajoutez aussi un champ
zoneSolde
contenant unWidget
de typeEntry
. - Testez.
Exercice 2
- Récupérez ce fichier contenant une classe
Compte
. - Importez ce fichier dans le fichier contenant votre classe
interface
. - Dans le constructeur, ajoutez un champ
listeComptes
contenant un tableau vide. - Testez.
Exercice 3
- Dans la méthode
initFrameCreationCompte
ajoutez un champboutonAjouterCompte
contenant unWidget
de typeButton
. Ce bouton a pour parentframeCreationCompte
, pour texte "Ajouter" et pour commande la méthodeajouterCompte
. - Créez la méthode
ajouterCompte
qui ajoute au tableaulisteComptes
une instance deCompte
. Son solde sera la valeur saisie par l'utilisateur dans le champzoneSolde
, son titulaire sera la personne sélectionnée grâce aux boutons radios. - Appelez ensuite la méthode
delete
duwidget
zoneSolde
. - Testez
Exercice 4
- Définissez une méthode
initFrameAfficherComptes
. - Appelez cette méthode dans votre constructeur.
- Dans cette méthode, ajoutez un champs
frameAfficherComptes
contenant unWidget
de typeFrame
. - Affichez cette
Frame
en bas à gauche, à 10 pixels des bords de la fenêtre. - Dans la frame
frameAfficherComptes
, ajoutez unWidget
de typeLabel
ayant pour texteComptes enregistres
. - Testez.
Exercice 5
- Dans la méthode
ajouterCompte
, ajoutez unWidget
de typeLabel
. Son parent estframeAfficherComptes
. - Il a pour texte le texte retourné par la méthode afficher de la classe
Compte
, appelée grâce à l'instance deCompte
créée (cf. exercice 3). - Testez.
Séance 9 (26/03/2014)
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.
Exercice 1
- Dans un fichier td9.py, créez une instance
fenetre
de la classeTk
.fenetre
aura pour titre "Films" et pour couleur de fond "black". - Ajoutez un
widget
de typeMenu
nommémenubar
ayant pour parentfenetre
. Utilisez la méthodeconfig
de la classeTk
pour quemenubar
soit le menu de l'instancefenetre
deTk
. - Ajoutez un
widget
de typeMenu
nommémenufichier
ayant pour parentmenubar
. Il faut aussi ajoutermenufichier
en cascade àmenubar
. - Ajoutez à
menufichier
une commande dont lelabel
est "Ouvrir" et lacommand
est une fonctionouvrir
. - Définissez la fonction
ouvrir
qui affiche dans le shell python "Bonjour". - Testez.
- Ajoutez à
menufichier
un séparateur. - Ajoutez à
menufichier
une commande dont lelabel
est "Quitter" et lacommand
est la fonctionfenetre.destroy
. - Testez.
Exercice 2
- Ajoutez à
fenetre
unwidget
de typeFrame
nomméframeAfficherFilms
. - Affichez
frameAfficherFilms
grâce à la méthodegrid
en haut à gauche, à 10 pixels des bords de la fenêtre. - Testez.
Exercice 3
- Récupérez ce fichier csv, copiez-le dans votre répertoire de travail et regardez son contenu.
- Dans votre code, supprimez le contenu de la fonction
ouvrir
. - Toujours dans la fonction
ouvrir
, ouvrez une boîte de dialogue permettant de récupérer, dans une variablefilename
, le nom d'un fichier de type csv. - Affichez
filename
dans le shell python. - Testez en récupérant le nom du fichier csv téléchargé.
Exercice 4
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])
- Dans la fonction
ouvrir
, utilisez un objetcsv.reader
pour lire ligne par ligne le fichier csv. - Pour chaque ligne du fichier csv, ajoutez un
widget
de typelabel
àframeAfficherFilms
contenant les informations de la ligne. N'oubliez d'appeler la méthodepack
pour afficher celabel
. - Testez.
Exercice 5
- Au début de votre fichier (juste après les imports), créez une classe
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
). - Ajoutez juste après la classe une variable
listeFilms
contenant un tableau vide. - Dans la fonction
ouvrir
, pour chaque ligne du fichier csv, créez une instance de la classeFilm
et ajoutez cette instance au tableaulisteFilms
. - Affichez dans le shell python la taille de
listeFilms
. - Testez.
Séance 10 (02/04/2014)
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.
Exercice 1 : création du formulaire de saisie
- Ajoutez à
fenetre
unwidget
de typeFrame
nomméframeSaisirFilms
. - Affichez
frameSaisirFilms
grâce à la méthodegrid
en haut à droite, à 10 pixels des bords de la fenêtre. - Ajoutez à
frameSaisirFilms
sixwidgets
de typeLabel
("Titre : ", "Realisateur : ", "Pays : ", "Annee : ", "Genre : ", "Note : "). - Testez.
- Après chaque label, ajoutez un
widget
de typeEntry
. Ces champs de saisi de texte permettront à l'utilisateur de saisir les informations pour créer un nouveau film. - Testez.
Exercice 2 : ajout du nouveau film dans la liste des films
- En dessous des
Entry
, ajoutez unwidget
de typeButton
avec pourtext
"Nouveau Film" et pourcommand
une fonctionnouveau
. - Créez la fonction
nouveau
qui affiche le contenu des champs de saisi dans le shell python. - Testez.
- Dans la fonction
nouveau
, créez une instance de la classeFilm
à partir des informations contenues dans les champs de saisi de texte, et ajoutez cette instance à votre listelisteFilms
. - Testez en affichant dans le shell la taille de la liste et en essayant de créer, via l'interface, un nouveau film.
- Toujours dans la fonction
nouveau
, ajoutez unwidget
de typeLabel
àframeAfficherFilms
. Il aura pourtext
les informations du film. - Testez.
- Ajoutez à la fonction
nouveau
les lignes permettant de "vider" les champs de saisie (méthodedelete
de la classeEntry
). - Testez.
Exercice 3 : enregistrement des films dans le fichier csv
- Dans votre variable
menuFichier
, juste après le bouton "Ouvrir" ajoutez un bouton ayant pourlabel
"Enregistrer sous" et pourcommand
une fonctionenregistrerSous
. - Créez la fonction
enregistrerSous
qui affiche quelques chose dans le shell python. - Testez.
- Toujours dans la fonction
enregistrerSous
, ouvrez une boîte de dialogue permettant de récupérer, dans une variablefilename
, un nom de fichier de type csv dans lequel sera enregistré vos films (tkinter.filedialog.asksaveasfile
, cf cours séance 9). - Affichez dans le shell python
filename.name
pour tester.
Exercice 4 : enregistrement des films dans le fichier csv (suite)
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])
- Dans la fonction
enregistrerSous
, ouvrez le fichierfilename.name
en mode écriture. - Pour chaque
Film
delistFilms
, ajoutez une ligne dans le fichier csv composée de la liste retournée par une méthodeintoList
de la classeFilm
. - Dans la classe
Film
, ajoutez la méthodeintoList
qui retourne les champs de la classe dans un tableau. - Testez.
Exercice 5 : Suppression de l'ancienne liste de films lorsqu'un nouveau fichier est chargé
- Lancez votre programme et ouvrez deux fois le fichier csv. Vous pouvez observer que les films apparaissent deux fois dans le
Frame
de gauche. Il va donc falloir viderframeAfficherFilms
à chaque fois que vous chargez un nouveau fichier (dans la méthodeouvrir
). Le code ci-dessous permet de supprimer tous leswidgets
contenu dans laFrame
leNomDeLaFrame
.
for w in leNomDeLaFrame.winfo_children(): w.destroy()
- Inspirez-vous en pour modifier
ouvrir
et ainsi résoudre le problème. - Pensez aussi à réinitialiser
listeFilms
(del listeFilms[:]
). - Testez.
Retour au sommaire.