TD 1 ISN

mail@pastecode.io avatar
unknown
python
7 months ago
6.6 kB
18
Indexable
Never
import tkinter as tk
from tkinter import scrolledtext
from tkinter import messagebox
import csv
from math import inf

class FenetrePrincipale(tk.Tk):
    
    
    def __init__(self):        
        super().__init__()
        self.title("Fenêtre pour s'échauffer")
        self.fichier = 'test.csv'
        self.dico={}
        self.age_min=None
        self.age_max=None
        self.lecture_data()
        self.age_min_max()

        self.creer_widgets()

        
    def creer_widgets(self):
        '''
        Création des widgets un à un et insertion grâce aux fonctions pack()
        '''

        # Création d'un bouton 1 (bleu clair) d'ouverture de messageBox
        # Positionnement tout au sommet de la fenêtre (tk.TOP)
        self.bouton_1 = tk.Button(self, text="Cliquez pour ouvrir une MessageBox", bg='lightblue')
      
        # Création d'un bouton 2 (jaune clair) pour quitter l'application
        # Positionnement tout en bas de l'espace 'side = tk.BOTTOM')
        self.bouton_2 = tk.Button(self, text="Quitter l'application", bg='lightyellow')
        self.bouton_3 = tk.Button(self, text="Afficher l'âge moyen")
        self.bouton_4 = tk.Button(self, text="Afficher selon seuil")
        self.bouton_1.bind('<Button-1>',self.messageBox1)
        self.bouton_2.bind('<Button-1>',self.quitter)
        self.bouton_1.pack(fill = 'x', side = tk.TOP)
        self.bouton_3.bind('<Button-1>',self.affiche_age_moyen)
        self.bouton_2.pack(fill = 'x', side = tk.BOTTOM)
        self.text_area = tk.scrolledtext.ScrolledText(self,
        wrap = tk.WORD, width = 50,
        height = 15,
        font = ("Times New Roman", 14))
        self.text_area.pack(side=tk.LEFT)
        self.text_area.insert(tk.INSERT,"∗∗∗∗ Zone de texte pour infos ∗∗∗∗" +'\n')
        self.bouton_3.pack(fill = 'x', side = tk.TOP)
        self.valeur_seuil = tk.DoubleVar()
        self.scale = tk.Scale(self,orient='horizontal',from_= self.age_min, to = self.age_max,resolution=1,tickinterval=25,label='Seuil a choisir',variable = self.valeur_seuil)
        self.scale.pack(fill = 'x')
        self.bouton_4.pack(fill = 'x', side = tk.TOP)
        self.bouton_4.bind('<Button-1>',self.affiche_selon_seuil)
        # A inserer dans la fonction creer_widgets

        self.select = tk.Label(self,
        text ="Radiobuttons :",
        font="Helvetica 10 bold")
        self.select.pack(anchor = tk.W)
        self.choix = tk.StringVar() # Variable commune aux 3 RadioButtons
        self.choix.set("Message")
        self.radio1 = tk.Radiobutton(self,text="Message simple",variable=self.choix, value="Message")
        self.radio1.pack(anchor = tk.W)
        self.radio2 = tk.Radiobutton(self,text="Lister les noms",variable=self.choix, value="Liste")
        self.radio2.pack(anchor = tk.W)
        self.radio3 = tk.Radiobutton(self,text="Effacer Scrolltext",variable=self.choix, value="Effacer")
        self.radio3.pack(anchor = tk.W)
        self.bouton_6 = tk.Button(self, text="Choix")
        self.bouton_6.pack()
        self.bouton_6.bind('<Button-1>',self.execute_choix)
        # Création de la zone de texte de type scrolledText pour écrire des informations 
        # Positionnement tout à gauche de la fenêtre (tk.LEFT) 
    
    
        # Création d'un bouton pour l'écriture dans le ScrolledText
        # écriture dans la zone de texte à gauche (avec bind):
        # de l'âge moyen calculé à partir des données du fichier csv
      
    
        # Création d'un scroller entre deux bornes min et max (mises à 0 et 100 d'abord)
    
        # Création d'un 2ème bouton pour écriture dans le ScrolledText
        # Permettra d'écrire la liste des personnes d'âge < seuil (avec bind)
        
    
        # Création des radiobuttons (exercice 2)
    

    ######################
    #Méthodes utilitaires#
    ######################
    def lecture_data(self): 
          """
          créer le dico et met à jour la structure dictionnaire dico 
          :paramètres: le fichier attribut
          :return:
          """
          with open(self.fichier, newline="") as csvfile:
            reader = csv.reader(csvfile, delimiter=",")
            dicotemp = {}
            for ligne in reader:
                ident, nom, age = ligne
                if ident not in dicotemp:
                    dicotemp[ident] = [nom,int(age)]
            self.dico = dicotemp
          
          
    def age_min_max(self):
         """
         fonction qui détermine les valeurs min et max des âges des personnes
         :paramètres: 
         :return:
         """
         age=[i[1] for i in self.dico.values()]
         self.age_min=min(age)
         self.age_max=max(age)
    ########################
    #Callback d'interaction#
    ########################
    def messageBox1(self,event):
        """
        fonction callback qui renvoie une messagebox simple suite au clic sur le bouton du haut
        :paramètres: event pour le lier au bouton "bouton 1"
        :return:
        """
        tk.messagebox.showinfo('Bouton_1', "Ouverture d’une MessageBox")
        
    def quitter(self,event):
        """
        fonction permettant de quitter proprement le programme
        :paramètres: 
        :return:
        """
        self.destroy()

    def affiche_age_moyen(self, event):
        """
        fonction callback qui calcul l'âge moyen des personnes du fichier csv
        :paramètres: event pour le lier au bouton "bouton 3"
        :return:
        """
        age=[i[1] for i in self.dico.values()]
        self.text_area.insert(tk.INSERT,str(sum(age)/len(age)) +'\n')
   
    def affiche_selon_seuil(self, event):
        seuil = self.valeur_seuil.get()
        for nom, age in self.dico.values():
            if age <= seuil:
                texte = f"=> {nom}  âgé de {age}\n"
                self.text_area.insert(tk.INSERT,texte)
    def execute_choix(self,event):
        if self.choix.get() == "Message": # cochage du radiobutton radio1
            self.text_area.insert(tk.INSERT,"Je viens de cocher le choix 1\n")
        elif self.choix.get() == "Liste": # cochage du radiobutton radio2
            self.text_area.insert(tk.INSERT,str(list([i[0] for i in self.dico.values()]))+"\n")
        else:
            self.text_area.delete(1.0, tk.END)
if __name__ == "__main__":           
    fenetre = FenetrePrincipale()
    fenetre.mainloop()
Leave a Comment