PYTHON : EXERCICES NIVEAU F
Les exercices proposés sur cette page combinent l'utilisation de la
programmation par objets et la mise en oeuvre d'une interface graphique.
L'objectif est d'utiliser le principe de dérivation afin de créer de nouveaux
types de widgets, à partir des widgets existantes, afin d'enrichir les
fonctionnalités de la bibliothèque
ezTK.
Pour bien démarrer, il est fortement conseillé de s'inspirer des exemples de
programmes utilisant le module Tkinter. Deux
sources de documentation sont fournies :
- Les codes sources disponibles dans la rubrique "Exemples
Niveau F" permettent de partir dans une bonne direction, en proposant un
squelette standardisé pour l'écriture de classes permettant de créer de
nouvelles widgets.
- Les chapitres 13, 14 et 15 du livre de Gérard Swinnen, "Apprendre à programmer avec Python" fournissent une série
d'exemples assez complets utilisant la programmation par objets pour la
réalisation d'interfaces graphiques.
Exercice F0
L'objectif de cet exercice d'introduction est de réaliser une série de
modifications simples sur les codes sources fournis dans la rubrique
"Exemples Niveau F" :
- Modifier la classe CounterLabel (cf. exemple F1)
pour que la valeur du compteur s'affiche entre crochets à l'intérieur du
label.
- Modifier la classe CounterLabel (cf. exemple F1)
pour rajouter les méthodes reset(self) et undo(self) permettant respectivement de restaurer le compteur
self à sa valeur de départ ou à la valeur qu'il avait
avant sa dernière modification. Même question avec la classe ImageButton (cf. exemple E2).
- Modifier la classe ScrolledList (cf. exemple F3)
pour rajouter un espace ajustable entre la liste et ses deux ascenseurs. Cet
espace pourra être configuré par l'utilisateur de la classe en définissant un
"paramètre nommé" pad=n lors de l'appel au
constructeur.
- Modifier la classe Board (cf. exemple F4)
pour que la taille de la grille puisse être définie par un paramètre nommé
size=n (pour une grille carréee) ou size=(m,n) (pour une grille rectangulaire). Les tailles
autorisées peuvent aller de 1 à 9 pour chacune des deux dimensions.
- Modifier la classe Board (cf. exemple E4) pour
que toutes les cellules soient redimensionnées uniformément lorsque la taille
de la fenêtre de l'application est modifiée.
- Modifier la classe Smileys (cf. exemple F5)
pour rajouter un bouton SWAP permettant d'inverser
simultanément l'état de tous les smileys de la grille.
Exercice F1
Ecrire une classe LabelGrid qui permet de créer une
grille regroupant M x N widgets de type Label. Après la création de l'objet, les paramètres de chaque
cellule (contenu de type 'texte' ou de type 'image', couleur d'avant-plan,
couleur d'arrière-plan, relief) doivent pouvoir être configurés indépendamment
pour chaque cellule, en indexant l'objet par les indices de la cellule (cf.
exemple d'utilisation). Pour que la widget garde une configuration de grille
M x N, il est important que la taille (exprimée en
nombre de caractères pour un contenu de type 'texte', ou en nombre de pixels
pour un contenu de type 'image') soit identique pour toutes les cellules.
Exemple d'utilisation :
================================================================================
LabelGrid : a rectangular grid of 'Label' widgets
================================================================================
>>> colors = ('#F00','#0F0','#00F','#FF0','#F0F','#0FF')
>>> grid = LabelGrid(root[0], size=(9,5)) # 'root[0]' is the toplevel window
>>> for n in range(9*5):
cell = divmod(n,5); grid[cell]['bg'] = colors[randrange(6)]
>>> grid.pack(side=LEFT, fill=BOTH, expand=YES, padx=5, pady=5)
Le résultat graphique obtenu avec cet exemple est représenté dans l'image
ci-dessous
Exercice F2
En combinant les fonctionnalités de la classe LabelGrid
(cf. exercice E1) et de la classe ImageButton
(cf. exemple E3), écrire une classe ButtonGrid
qui permet de créer une grille regroupant M x N
widgets de type Button. Comme pour la classe
ImageButton, le constructeur est appelé en passant
en paramètre, une liste de noms de fichiers au format GIF qui seront utilisés
pour l'affichage des boutons (sauf qu'ici, la liste d'images est commune à
toutes les cellules de la grille). De même, le changement d'état de la cellule
s'obtient en lui affectant une nouvelle valeur d'état (cf. exemple
d'utilisation). Après la création de l'objet, comme pour la classe LabelGrid, les paramètres de chaque cellule doivent pouvoir être
configurés indépendamment pour chaque cellule, en indexant l'objet par les
indices de la cellule. Enfin, pour que la widget garde une configuration de
grille M x N, la taille de toutes les cellules doit
être identique et égale à la taille de la plus grande des images de la liste.
Exemple d'utilisation :
================================================================================
ButtonGrid : a rectangular grid of 'Button' widgets with GIF images
================================================================================
>>> names = ["Z%s.gif" % c for c in "RGBCMY"]
>>> grid = ButtonGrid(root, names, size=(12,6), bg='#000')
>>> for n in range(12*6):
cell = divmod(n,6); grid(cell, randrange(6))
>>> grid.pack(side=LEFT, fill=BOTH, expand=YES, padx=5, pady=5)
Le résultat graphique obtenu avec cet exemple est représenté dans l'image
ci-dessous
Exercice F3
TODO...
Exercice F4
Ecrire une classe Slide qui réimplémente le
programme slide (cf. exercice C6) en utilisant cette
fois-ci, le paradigme de programmation par objets. On définira une classe
SlideBoard pour implémenter l'ensemble des
fonctionnalités nécessaires à la grille de jeu.
Exercice F5
Ecrire une classe Hunt qui réimplémente le
programme hunt (cf. exercice C7) en utilisant cette
fois-ci, le paradigme de programmation par objets. On utilisera une classe
dérivée de la classe ButtonGrid (cf. exercice F2)
pour implémenter la grille de jeu.
Exercice F6
Ecrire une classe Sequence qui réimplémente le
programme sequence (cf. exercice C8) en utilisant
cette fois-ci, le paradigme de programmation par objets. On utilisera une classe
dérivée de la classe ButtonGrid (cf. exercice F2)
pour implémenter la grille de jeu.
...
Christophe Schlick