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 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.
  • 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éthode afficher (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 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).

Exercice 2

  • Ouvrez un fichier "Compte.py". Importez-y les éléments du fichier "Personne.py". Définissez une classe 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.
  • Définissez une méthode afficher qui appelle la fonction print 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éthode retirer(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é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".

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 classe Personne, avec le champ etablissement (resp. salaire). Définissez aussi les constructeurs des classes Etudiant et Salarie.
  • Pour chacune de ces sous classes, définissez une méthode afficher qui appelle la méthode afficher de la classe Personne 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 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".

Exercice 2

  • Dans votre fichier "Compte.py", définissez une sous classe LivretA de la classe Compte. Définissez aussi son constructeur.
  • Supprimez le test de la méthode retirer de la classe Compte, celle-ci se contentera de retirer l'argent quelque soit le solde du compte.
  • Dans la classe 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.
  • Ajoutez dans le fichier "td2.py" les lignes nécessaires au test de la méthode retirer de la classe LivretA.
  • Dans la classe 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%).
  • Ajoutez dans le fichier "td2.py" les lignes nécessaires au test de la méthode interets de la classe LivretA.

Exercice 3

  • Dans votre fichier "Compte.py", définissez une sous classe Courant de la classe Compte. Définissez aussi son constructeur.
  • Dans la classe Courant, ajoutez une méthode retirer. Celle-ci appelle la méthode retirer de Compte puis appelle une méthode agios de Courant.
  • Toujours dans la classe Courant, définissez la méthode agios. 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é.
  • 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 classe Etudiant et une instance de la classe Salarie. Pour chacune de ces instances, appelez la méthode afficher. 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 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.
  • 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 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.
  • 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 et LivretA de façon à ce qu'ils prennent une valeur pour self.solde en paramètre.
  • Ajoutez la valeur 0 par défaut à ce paramètre pour les classes Compte et Courant, 500 pour la classe LivretA.
  • Créez un fichier td4.py. Dans ce fichier, créez une instance 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).
  • Appelez la méthode afficher pour l1 et l2. 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 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").
  • Modifiez les affectations du constructeur de Personne pour remplir les champs self.nom et self.prenom en découpant la chaine prise en paramètre (utilisez split).
  • 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 champs self.nom et self.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 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")
  • Appelez le constructeur de Personne pour remplir le champ self.titulaire de Compte. Utilisez pour cela la fonction join.
  • Dans td4.py, testez les constructeurs modifiés.

Exercice 5

  • Modifiez la méthode afficher de la classe Personne 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 classe Turtle.
  • 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 classe Dessin 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 classe Dessin 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 classe Dessin qui appelle la méthode rectangle 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 classe Dessin 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 classe Dessin 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éthode rectangle 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 classe Tk.
  • Ajoutez un champ self.titre contenant un Widget de type Label. 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 champ self.labelNom contenant un Widget de type Label avec pour texte "Nom : ".
  • Ajoutez ensuite un champ self.zoneNom contenant un Widget de type Entry.
  • 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 champ self.boutonAjouter contenant un Widget de type Button avec pour texte "Ajouter". Il appelle la méthode ajouter.
  • 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 variable labelPersonne contenant un Widget de type Label avec pour texte ("Etudiant : "+n+" "+p+" "+e").
  • Sinon, si la variable contenant le salaire n'est pas vide, ajoutez une variable labelPersonne contenant un Widget de type Label avec pour texte ("Salaire : "+n+" "+p+" "+s").
  • Sinon, ajoutez une variable labelPersonne contenant un Widget de type Label 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éthode ajouter.
  • 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-classes Etudiant et Salarie.
  • 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 de Personne, Etudiant ou Salarie 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 un Widget de type Frame.
  • 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éthode initFrameCreationPersonnes.
  • 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 un Widget de type Frame.
  • Affichez cette Frame à gauche, à 10 pixels des bords de la fenêtre.
  • Dans la frame frameAfficherPersonnes, ajoutez un Widget de type Label ayant pour texte Personnes enregistrees.
  • Testez.
  • Modifiez la méthode ajouter pour que les personnes s'affichent dans la Frame frameAfficherPersonnes.
  • Testez.

Exercice 5

  • Ajoutez dans le constructeur un champ personneSelectionnee de type IntVar.
  • Dans la méthode 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.
  • Testez.
  • Ajoutez une command à vos boutons radios. Celle-ci permet d'appeler une méthode selectionner de votre classe interface.
  • Ajoutez la méthode selectionner. Elle appelle la méthode afficher 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éthode initFrameCreationCompte.
  • Appelez cette méthode dans votre constructeur.
  • Dans cette méthode, ajoutez un champ frameCreationCompte contenant un Widget de type Frame.
  • Affichez cette Frame en bas à droite, à 10 pixels des bords de la fenêtre.
  • Dans cette frame, ajoutez un Widget de type Label ayant pour texte Gestionnaire de comptes.
  • Ajoutez aussi un champ zoneSolde contenant un Widget de type Entry.
  • 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 champ boutonAjouterCompte contenant un Widget de type Button. Ce bouton a pour parent frameCreationCompte, pour texte "Ajouter" et pour commande la méthode ajouterCompte.
  • Créez la méthode 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.
  • Appelez ensuite la méthode delete du widget 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 un Widget de type Frame.
  • Affichez cette Frame en bas à gauche, à 10 pixels des bords de la fenêtre.
  • Dans la frame frameAfficherComptes, ajoutez un Widget de type Label ayant pour texte Comptes enregistres.
  • Testez.

Exercice 5

  • Dans la méthode ajouterCompte, ajoutez un Widget de type Label. Son parent est frameAfficherComptes.
  • Il a pour texte le texte retourné par la méthode afficher de la classe Compte, appelée grâce à l'instance de Compte 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 classe Tk. fenetre aura pour titre "Films" et pour couleur de fond "black".
  • Ajoutez un 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.
  • Ajoutez un widget de type Menu nommé menufichier ayant pour parent menubar. Il faut aussi ajouter menufichier en cascade à menubar.
  • Ajoutez à menufichier une commande dont le label est "Ouvrir" et la command est une fonction ouvrir.
  • Définissez la fonction ouvrir qui affiche dans le shell python "Bonjour".
  • Testez.
  • Ajoutez à menufichier un séparateur.
  • Ajoutez à menufichier une commande dont le label est "Quitter" et la command est la fonction fenetre.destroy.
  • Testez.

Exercice 2

  • Ajoutez à fenetre un widget de type Frame nommé frameAfficherFilms.
  • Affichez frameAfficherFilms grâce à la méthode grid 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 variable filename, 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 objet csv.reader pour lire ligne par ligne le fichier csv.
  • Pour chaque ligne du fichier csv, ajoutez un widget de type label à frameAfficherFilms contenant les informations de la ligne. N'oubliez d'appeler la méthode pack pour afficher ce label.
  • 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 classe Film et ajoutez cette instance au tableau listeFilms.
  • 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 un widget de type Frame nommé frameSaisirFilms.
  • Affichez frameSaisirFilms grâce à la méthode grid en haut à droite, à 10 pixels des bords de la fenêtre.
  • Ajoutez à frameSaisirFilms six widgets de type Label ("Titre : ", "Realisateur : ", "Pays : ", "Annee : ", "Genre : ", "Note : ").
  • Testez.
  • Après chaque label, ajoutez un widget de type Entry. 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 un widget de type Button avec pour text "Nouveau Film" et pour command une fonction nouveau.
  • 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 classe Film à partir des informations contenues dans les champs de saisi de texte, et ajoutez cette instance à votre liste listeFilms.
  • 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 un widget de type Label à frameAfficherFilms. Il aura pour text les informations du film.
  • Testez.
  • Ajoutez à la fonction nouveau les lignes permettant de "vider" les champs de saisie (méthode delete de la classe Entry).
  • Testez.

Exercice 3 : enregistrement des films dans le fichier csv

  • Dans votre variable menuFichier, juste après le bouton "Ouvrir" ajoutez un bouton ayant pour label "Enregistrer sous" et pour command une fonction enregistrerSous.
  • 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 variable filename, 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 fichier filename.name en mode écriture.
  • Pour chaque 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.
  • Dans la classe Film, ajoutez la méthode intoList 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 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()

  • Inspirez-vous en pour modifier ouvrir et ainsi résoudre le problème.
  • Pensez aussi à réinitialiser listeFilms (del listeFilms[:]).
  • Testez.

Retour au sommaire.