Gestion de notes avec absence

Liste des couleurs Tkinter accessibles par leur nom

Dans cette activité, vous allez :

- améliorer l'interface graphique de l'activité précédente et ajouter un champ de saisie du nombre de notes,

- permettre à l'utilisateur de mettre 'abs' lors d'une absence et modifier en conséquence la fonction MoyMinMax,

- mettre en évidence la(les) note(s) mini et maxi

Etape 1 : améliorer l'interface graphique de l'activité précédente et ajouter un champ de saisie du nombre de notes

L'objectif est d'obtenir l'interface graphique suivante :

gestionNoteAbsence1

Au lancement du script la fenêtre s'affiche avec le nom de l'évaluation, un champ de saisie pour rentrer le nombre de notes et un bouton Afficher Tableau qui permettra d'afficher le tableau de saisie de notes, non plus horizontalement, mais verticalement.

A noter :

- le bouton Afficher Tableau appellera la fonction affTableau() qui terminera d'afficher le reste des champs comme indiqué ci-dessus,

- suivant le nombre de notes saisi, la position de l'affichage de la moyenne se situe toujours en dernière ligne !

Une fois les notes saisie, l'appui sur le bouton Calculer, qui appelle la fonction MoyMinMax(), affiche la moyenne sous la colonne des notes :

gestionNoteAbsence2

Je vous conseille de reproduire la fenêtre ci-dessus afin d'indiquer par dessus les indices des lignes (row) et colonnes (column) avant de vous lancer dans du code.

Prenez le temps de faire les changements au fur et à mesure : on modifie un peu, puis on teste !

A RENDRE :

Vous m'envoyez le fichier python MoyMinMax_saisieTab1.py de votre code en pièce jointe.

Pensez à préciser dans le nom du fichier votre nom !

Etape 2 : permettre à l'utilisateur de mettre 'abs' lors d'une absence

L'objectif est de permettre la saisie de 'abs' au lieu d'une note.

Il n'y a donc aucun changement concernant l'interface graphique.

En revanche, la fonction MoyMinMax est à modifier : 'abs' n'est pas un nombre et cela modifie le calcul de la moyenne.

Voici quelques conseils de travail :

1- la construction du tableau notes[ ] est à changer :

#----construire le tableau notes au format float
for j in range(nbrNotes):
    notes.append(float(saisieNotes[j].get()))

En effet, lorsque saisieNotes[ j ].get() contient 'abs', cela ne peut pas être converti en float !

Il serait simple de passer directement à l'indice j suivant, mais les indices du tableau notes[ ] ne correspondraient plus aux indices du tableau saisieNotes[ ].

Ce n'est pas vraiment gênant pour le moment, mais vous verrez plus tard que cela nous sera utile de conserver les mêmes indices.

Mais quoi mettre dans le tableau note[ j ] lorsque le champ saisieNotes[ j ] contient 'abs' : tout simplement on mettra abs !

Ci-dessous un exemple de tableau notes[ ] contenant une valeur avec 'abs' :

gestionNoteAbsence3

C'est une des caractéristiques des Listes (tableaux) en python : les types de valeurs peuvent être différentes à l'intérieur d'une liste !

Ce n'est pas toujours le cas dans d'autres langages.

2- la boucle while est à modifier pour prendre en compte la cas où notes[ j ] est 'abs' :

    i=1
    while i<len(notes):
        #recherche du minimum
        if min>notes[i]:
            min=notes[i]
        #recherche du maximum
        if max<notes[i]:
            max=notes[i]
        #calcul de la somme des valeurs du tableau
        somme=somme+notes[i]
        i=i+1

3- le calcul de la moyenne est à modifier car il faut retirer les absents

Le calcul de la moyenne ci-dessous n'est pas bon : la somme est divisée par le nombre d'éléments du tableau qui peuvent contenir 'abs' !

moy=round(somme/len(notes), 1)

A RENDRE :

Vous m'envoyez le fichier python MoyMinMax_saisieTab2.py  de votre code en pièce jointe.

Pensez à préciser dans le nom du fichier votre nom !

Etape 3 : mettre en évidence la(les) note(s) mini et maxi

L'objectif est de mettre en évidence la(les) note(s) mini et maxi en changeant la couleur de la cellule où ces notes sont.

Par exemple :

- on mettra en jaune la note la plus basse, mais si plusieurs élèves ont la même note la plus basse on les mettra toutes en évidence,

- on mettra en vert la note la plus haute, mais si plusieurs élèves ont la même note la plus haute on les mettra toutes en évidence.

1- Comment changer la couleur de fond ?

Pour faire cela on utilisera les propriétés ou options des champs dont vous retrouverez des explications détaillées dans la documentation python de la bibliothèque Tkinter et dont voici un court extrait concernant le changement des couleurs :

Lors de la création de l'objet, à l'aide d'arguments par mots-clés

fred = Button(self, fg="red", bg="blue")

Après la création de l'objet, en manipulant le nom de l'option comme une entrée de dictionnaire

fred["fg"] = "red"

fred["bg"] = "blue"

Utilisez la méthode config() pour mettre à jour plusieurs attributs après la création de l'objet

fred.config(fg="red", bg="blue")

Pour l'explication complète d'une option donnée et de son comportement, voir les pages de manuel Tk de l'objet graphique en question.

avec fg : couleur de la font et  bg : couleur du background

2- Modifier MoyMinMax pour trouver les valeurs mini et maxi identiques

Le code ci-dessous, que nous utilisons depuis le début, permet avec une boucle de chercher la valeur la plus petite min et la plus grande max.

    #----Déterminer moy, min et max
    min=notes[0]
    max=notes[0]
    somme=notes[0]
    i=1
    while i<len(notes):
        if (notes[i]!='abs'):
            #recherche du minimum
            if min>notes[i]:
                min=notes[i]
            #recherche du maximum
            if max<notes[i]:
                max=notes[i]
            #calcul de la somme des valeurs du tableau
            somme=somme+notes[i]
        i=i+1

Mais, si il existe plusieurs fois min ou max dans le tableau de notes, on ne le sais pas.

Plusieurs techniques sont possibles pour gérer ce problème.

La technique ici n'est pas la plus simple, mais elle vous fait travailler de nouveau sur les tableaux et les boucles !

L'idée est de rechercher les indices où se trouvent les valeurs min et max dans une autre boucle.

Nous avons déjà traité ce problème précédemment avec la fonction rechValeur :

#Fonction rechValeur(val: valeur à rechercher , tab: tableau de valeurs)
def rechValeur(val, tab):
    tabIndice=[]
    i=0
    while i<len(tab):
        if val==tab[i]:
            tabIndice.append(i)
        i=i+1
    return tabIndice

Voyons ce que cela donne avec un exemple lorsque la fonction rechValeur recherche dans le tableau notes la valeur 5 :

rechValeur(5,notes)

gestionNoteAbsence42

La valeur retournée par la fonction est mémorisée dans le tableau indiceMin

Modifier la fonction MoyMinMax afin de :

- rechercher les indices des valeurs min en appelant rechValeur avec min et notes : la valeur retournée est mémorisée dans le tableau indiceMin

- utiliser ces indices pour mettre en jaune l'arrière plan où se trouvent min

Si cela fonctionne vous devez obtenir l'interface graphique suivante :

gestionNoteAbsence4

Une fois que cela fonctionne, vous pouvez procéder de même pour les valeurs max.

Vous devez alors obtenir l'interface graphique suivante :

gestionNoteAbsence5

A RENDRE :

Vous m'envoyez le fichier python MoyMinMax_saisieTab3.py  de votre code en pièce jointe.

Pensez à préciser dans le nom du fichier votre nom !

Etape 4 : Prendre en compte une nouvelle saisie

1- Erreur sur le calcul de la moyenne

Vous constaterez sans doute que si vous changez les notes maxi ou mini et que vous appuyez de nouveau sur Calculer vous avez des erreurs de calculs sur la moyenne.

Pour comprendre cela, examinons le début du code de la fonction MoyMinMax ainsi que les délarations de variables du programme de plus prêt :

#------------------déclaration des variables-----------------------------------
notes=[] #création du tableau de notes - format float
saisieNotes=[]
#------------------fonction MoyMinMax------------------------------------------
def MoyMinMax(): global moy, min, max, nbrAbs #----construire le tableau notes au format float for j in range(nbrNotes): if saisieNotes[j].get()!='abs': notes.append(float(saisieNotes[j].get())) else: notes.append(saisieNotes[j].get()) nbrAbs+=1

Vous constatez que à chaque fois qu'est appelé la fonction MoyMinMax on ajoute au tableau notes les notes saisies.
C'est un problème car voici un exemple de déroulement après avoir lancé le programme :

- tableau notes=[ ] initialisé au début du programme (le tableau est déclaré vide)
- saisie des notes par l'utilisateur
- appuie sur Calculer
- appel de la fonction MoyMinMax
- les notes saisies sont ajoutées à la fin du tableau notes, comme il était vide cela ne pose pas de problème
- s'ensuit le reste des instructions du programme sans problème
- puis l'utilisateur change les notes saisies (par exemple il s'est trompé),
- il appuie sur Calculer
- la fonction MoyMinMax est appelée
- les notes saisies sont ajoutées à la fin du tableau notes, et là cela devient un problème : les anciennes notes sont au début du tableau notes !

Trouvez une solution pour résoudre ce problème.

2- Problème de modification de la couleur du fond des notes mini et maxi

Vous constaterez aussi que si vous changez les notes maxi ou mini et que vous appuyez de nouveau sur Calculer, cela ne change pas la couleur des anciennes cellules.

Une solution radicale est de remettre le fond gris de toutes les cellules (la couleur est white smoke) dans la fonction MoyMinMax.

Une petite boucle devrait faire cela facilement dans la fonction MoyMinMax en choisissant le bon endroit pour le faire !

Et voilà, vous devriez avoir quelque chose de bien fonctionnel !

A RENDRE :

Vous m'envoyez le fichier python MoyMinMax_saisieTab4.py  de votre code en pièce jointe.

Pensez à préciser dans le nom du fichier votre nom !