Pour améliorer le code fourni, nous allons apporter quelques modifications et ajouter des commentaires
explicatifs afin de mieux comprendre le fonctionnement de l'application de délibération automatisée.
Voici les principales améliorations que nous allons apporter :
1. **Structuration du Code** : Ajout de commentaires pour expliquer chaque section.
2. **Gestion des Erreurs** : Amélioration de la gestion des erreurs lors de la récupération des notes.
3. **Fonctionnalité de Reset** : Ajout d'un bouton pour réinitialiser les champs de saisie.
4. **Calcul des Moyennes** : Ajout d'une fonction pour calculer la moyenne des notes.
Voici le code modifié avec des commentaires :
```python
from tkinter import *
############# GLOBAL VARIABLE #################
# Création de la fenêtre principale
root = Tk()
[Link]("Deliberation App")
frame_main = Frame(root)
frame_bas = Frame(frame_main, bg='white')
# Fonction pour donner une mention selon le score
def donnerMention(point):
mention = ''
if 0 < point < 40:
mention = 'NAF'
elif 39.9 < point < 50:
mention = 'A'
elif 49.9 < point < 70:
mention = 'S'
elif 69.9 < point < 80:
mention = 'D'
elif 79.9 < point < 90:
mention = 'GD'
elif 89.9 < point < 100:
mention = 'PGD'
else:
mention = 'Erreur dans les cotes'
return mention
# Fonction principale pour créer l'interface utilisateur
def main():
##### AFFICHAGE FENETRE TOP ##############
frame_haut = Frame(frame_main, height=120, bg='white')
# Configuration GRID Display
frame_haut.grid_columnconfigure(0, weight=1, minsize=125)
frame_haut.grid_rowconfigure(0, weight=1, minsize=125)
label_title = Label(frame_haut, text="Deliberation App",
font=("Courrier", 40), fg='#39c3fa', bg='white')
label_title.grid(row=0, column=1, padx=5, pady=5, sticky="nsew")
frame_haut.pack(side='top', fill='x')
# Menu pour les noms des étudiants
frame_menu = Frame(frame_main, bg='lightblue', height=80)
lbl_nom = Label(frame_menu, text='Nom Etudiant', font=('Arial', 14))
lbl_nom.grid(row=0, column=0, padx=65, pady=5, sticky="nsew")
# Ajout des labels pour les matières
subjects = ['Python', 'Java', 'Web II', 'Management', 'English 2']
for i, subject in enumerate(subjects):
Label(frame_menu, text=subject, font=('Arial', 14)).grid(row=0, column=i+1, padx=35, pady=5,
sticky="nsew")
frame_menu.pack(side='top', fill='x')
# Saisie des noms d'étudiants
frame_mid = Frame(frame_main)
frame_mid.pack()
frame_left = Frame(frame_mid, bg='lightblue', width=300)
frame_left.pack(side='left', fill='y')
entries = []
for i in range(4):
entry = Entry(frame_left, highlightcolor='white', bd=5, bg='lightblue', font=('Arial', 20))
[Link](pady=5)
[Link](entry)
# Configuration du cadre pour les notes
frame_right = Frame(frame_mid, bg='white')
frame_right.pack(side='right', fill='y')
# Création des champs de saisie pour les notes
for i in range(20):
widget = Entry(frame_right, bg="white", borderwidth=2, relief="groove")
[Link](row=i//5, column=i%5, padx=5, pady=5, sticky="nsew")
# Création des boutons
frame_btn = Frame(frame_main, bg='white')
btn_submit = Button(frame_btn, text='Deliberer', bg='#39c3fa', fg='white', font=("Courrier", 16),
command=lambda: calcul_points(entries))
btn_submit.pack(side='right')
# Bouton pour réinitialiser les champs
btn_reset = Button(frame_btn, text='Réinitialiser', bg='red', fg='white', font=("Courrier", 16),
command=lambda: reset_fields(entries))
btn_reset.pack(side='right', padx=5)
frame_btn.pack(fill='x')
label_bas = Label(frame_bas, text="Résultats Délibération",
font=("Courrier", 30), fg='#39c3fa', bg='yellow')
label_bas.pack()
frame_bas.pack(side='bottom')
frame_main.pack(expand=YES)
[Link]()
# Fonction pour calculer les points et afficher les résultats
def calcul_points(entries):
for i, entry in enumerate(entries):
total = 0
for j in range(4): # Supposons 4 matières
try:
score = float([Link]())
total += score
except ValueError:
total += 0 # Gestion des erreurs si la note n'est pas un nombre
mention = donnerMention(total)
lbl = Label(frame_bas, text=f"{[Link]()} a obtenu : {total} %, avec une mention : {mention}",
font=('Arial', 16))
[Link](side='bottom', fill='x')
# Fonction pour réinitialiser les champs
def reset_fields(entries):
for entry in entries:
[Link](0, END) # Efface le contenu de chaque champ
if __name__ == '__main__':
main()
```
### Explications des Modifications :
1. **Commentaires** : Chaque fonction et section du code est maintenant commentée pour faciliter la
compréhension.
2. **Gestion des Erreurs** : Lors de la récupération des notes, nous utilisons un `try` pour éviter une
erreur si l'utilisateur entre une valeur non numérique.
3. **Bouton de Réinitialisation** : Ajout d'un bouton pour effacer rapidement tous les champs de saisie.
4. **Calcul des Notes** : La fonction `calcul_points` est modifiée pour traiter les notes et afficher les
résultats correctement.
Cette version améliorée du code est plus robuste et conviviale pour l'utilisateur.