Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/01/2008, à 14:33

Instanton

Gestionnaire de prets

Bonjour à  tous et à  toutes.

J'apprends le python (oui je sais : le Ruby/Perl/C++/Assembleur/java/binaire [que les trolleurs biffent les mentions inutiles] c'est mieux mais j'ai choisi le Python et je l'adore tongue ! ) et pour cela je me donne des petits projets à  faire. Le problème c'est de trouver des projets motivants ^^. J'avais fait un petit jeu de la vie et ça marchait bien. J'avais envie de chipoter avec le traitement de fichiers de python.
Je me suis dit que j'en avais marre de prêter des trucs (bd, romans, cd, dvd, etc.), d'oublier à  qui et quand et de finir par ne plus jamais les revoir !
J'ai donc écrit un petit gestionnaire de prets en Python, qui gère une petit base de données dans un fichier "prets". Comme j'ai déjà  beauuuucoup profité de ce forum et qu'il m'a beauuuucoup appris, je me dis que pour une fois que j'ai fait qqch moi-même, ça vaut sans doute le coup de le mettre dans un post. Voilà  wink.

Voici à  quoi ressemble la fenêtre :

http://img341.imageshack.us/my.php?imag … irecr4.png

Et voici le code :

# -*- coding: utf-8 -*-


# ------------------------------------------------------------------------------------
#|                                                                                    |   
#| Programme de gestion d'emprunts : écriture dans un fichier des emprunts,           |   
#|   à  savoir le nom de l'objet emprunté, le nom de l'emprunteur et la date de        |   
#|   l'emprunt.                                                                       |       
#|   Première version "finale" v1.0 : 05/01/08                                        |           
#|   Licence : GPL                                                                    |           
#|   Base : Instanton (sebdeval@laposte.net)                                          |           
#|                                                                                    |       
# ------------------------------------------------------------------------------------



from Tkinter import *
import tkMessageBox


########################################################################################
##################      Fonctions independantes          ###############################
########################################################################################




def effacerLignes(fichier, n1):
    '''Efface 4 lignes dans fichier'''
    
    #On ouvre le fichier de donneés en lecture et on stocke ses lignes dans une liste
    lecture = open(fichier, 'r')
    f = lecture.readlines()
    lecture.close()
    
    #On vire les lignes de l'entrée qui va être effacée dans le liste
    #Le -1 s'eplique par le fait que les lignes d'un fichier commencent au n°1 alors que les index d'une ligne à  0
    f.pop(n1-1)
    f.pop(n1-1)
    f.pop(n1-1)
    f.pop(n1-1)

    #On recrée un fichier du même nom dans lequel on écrit le contenu de la liste
    ecriture = open(fichier, 'w')
    for i in f:
        ecriture.write(i)
    ecriture.close()



########################################################################################
##################      Classe principale                ###############################
########################################################################################



class Application(Tk):
    '''Classe principale '''
    
    def __init__(self):
    
        #Le fichier banque sera celui des données
        self.banque = 'prets'
        
        #On vérifie que celui-ci existe bien, sinon on le crée
        try:
            essai = open('prets','r')
            essai.close()
        except:
            essai = open('prets', 'a')
            essai.close()

        #Initialisation de la fenêtre
        Tk.__init__(self)
        self.title("Gestionnaire d'emprunts")
        
        #Boutons
        Button(self, text='Quitter', command=self.destroy).grid(row = 102, column = 102, padx = 10 , pady = 10)
        Button(self, text='Nouveau', command=self.ouvretopNouveau).grid(row = 102, column = 1, padx = 10, pady = 10)
        Button(self, text='Effacer', command=self.testEfface).grid(row = 102, column = 2, padx = 10, pady = 10)
      
        #Emprunteur
        self.texteEmprunteur = Label(self, text = 'Emprunteur : ')
        self.texteEmprunteur.grid(row = 2, column = 100, padx = 10 , pady = 10)
        self.champEmprunteur = Label(text = '', width = 20)
        self.champEmprunteur.grid(row = 2, column = 101, padx = 10 , pady = 10)
        
        #Date de l'emprunt
        self.texteDate = Label(self, text = "Date de l'emprunt : ")
        self.texteDate.grid(row = 3, column = 100, padx = 10 , pady = 10)
        self.champDate = Label(text = '',width = 20)
        self.champDate.grid(row = 3, column = 101, padx = 10 , pady = 10)
       
        #Conteneur de la liste et de sa scrollbar
        self.conteneur = Frame(self)
        self.conteneur.grid(row = 1 , column = 1, padx = 10 , pady = 10, rowspan = 50, columnspan = 50)

        #Scrollbar de la liste
        self.ascenseur = Scrollbar(self.conteneur)
        self.ascenseur.grid(row = 1, column = 2)

        #Liste des prets
        self.liste = Listbox(self.conteneur, width = 40)
        self.liste.grid(row = 1, column = 1)

        #On associe la scrollbar à  la liste et inversément
        self.ascenseur.config(command = self.liste.yview)
        self.liste.config(yscrollcommand = self.ascenseur.set)

        #Appel de la fonction clic lorsqu'on clique sur la listbox
        self.liste.bind('<ButtonRelease-1>',self.clic)
       
        #On remplit la liste
        self.affichage_liste()
        
 

    def clic(self, event):
        '''Désigne l'élément de la liste sélectionné'''
        #On le désigne par actif
        self.actif=self.liste.curselection() 
        #On met une exception pour si la ligne est vide.
        try:
            self.champEmprunteur.configure( text= self.donnees[int(self.actif[0])][1])
            self.champDate.configure( text= self.donnees[int(self.actif[0])][2])
        except:
            print "Pas d'élément !"
        


    def rafraichir_liste(self):
        '''Vide la liste et la remplit avec le fichier '''
        self.liste.delete(0, self.nb_lignes)
        self.affichage_liste()
        


    def affichage_liste(self):
        '''Organise les données provenant du fichier et les place dans la listbox'''
        #On ouvre et on lit le fichier de données
        fichier = open(self.banque, 'r')
        self.entrees = fichier.readlines()
        fichier.close()
        
        #On va chercher le délimiteur % pour afficher les donénes en dessous
        self.donnees = []
        self.nb_lignes = len(self.entrees) 
        for i in range(self.nb_lignes):
            if self.entrees[i][0] == '%':
                self.donnees.append(  [ self.entrees[i+1].replace("\n",""), self.entrees[i+2].replace("\n",""), self.entrees[i+3].replace("\n","") ] )
        self.nb_donn = len(self.donnees)
        #Rentrer les éléments dans la listbox
        for j in range(self.nb_donn):
            self.liste.insert(END, self.donnees[j][0])




    def testEfface(self):
        '''Teste si il y a bien qqch à  effacer'''
        try:
            #On teste si self.actif existe bien
            essai =  int(self.actif[0])
            self.ouvretopEfface()
        except: 
            tkMessageBox.showerror("Pas d'objet sélectionné","Vous n'avez sélectionné aucun objet, il n'y a donc rien à  effacer !")



    def ouvretopNouveau(self):
        '''Pop-up qui s'ouvre quand on ajoute une entrée'''

        #Sous-fonction appelée par le bouton : 
        def assigner():
            '''Assigne les données rentrées par l'utilisateur, les rentres et ferme le pop-up'''
            self.entree_nom = saisie_nom.get()
            self.entree_emprunteur = saisie_emprunteur.get()
            self.entree_date = saisie_date.get()
            self.creer()
            t1.destroy()
        
        #Initilisation du pop-up
        t1=Toplevel()
        t1.title("Nouvel emprunt")
        
        #Saisie du nom de l'objet emprunté
        Texte_nom = Label(t1, text='Nom : ')
        Texte_nom.grid(row=1, column = 1)
        saisie_nom = StringVar()
        Champ_nom = Entry(t1, textvariable = saisie_nom)
        Champ_nom.grid(row = 1, column = 2, columnspan = 3, padx = 10 , pady = 10)
        self.entree_nom = saisie_nom.get()

        #Saisie de l'emprunteur
        Texte_emprunteur = Label(t1, text='Emprunteur : ')
        Texte_emprunteur.grid(row=2, column = 1)
        saisie_emprunteur = StringVar()
        Champ_emprunteur = Entry(t1, textvariable = saisie_emprunteur)
        Champ_emprunteur.grid(row = 2, column = 2, columnspan = 3, padx = 10 , pady = 10)
        
        #Saisie de la date de l'emprunt
        Texte_date = Label(t1, text='Date : ')
        Texte_date.grid(row=3, column = 1)
        saisie_date = StringVar()
        Champ_date = Entry(t1, textvariable = saisie_date)
        Champ_date.grid(row = 3, column = 2, columnspan = 3, padx = 10 , pady = 10)
        self.entree_date = saisie_date.get()
        
        #Boutons
        Button(t1, text="Créer", command = assigner).grid(row = 4, column = 3, padx = 10 , pady = 10)
        Button(t1,text="Annuler",command=t1.destroy).grid(row = 4, column = 4, padx = 10 , pady = 10)





    def ouvretopEfface(self):
        '''Pop-up de confirmation d'effacement'''
        def enleve():
            self.efface()
            t2.destroy()

        #Initilisation du pop-up
        t2 = Toplevel()
        t2.title("Effacer ?")

        #On ouvre le fichier de données en lecture et on met ses lignes dans une liste
        lecture = open(self.banque, 'r')
        lignes = lecture.readlines()
        lecture.close()

        #On retient les datas qui nous intéressent (élément sélectionné)
        i = int(self.actif[0])
        nom = lignes[i*4+1]
        emprunteur = lignes[i*4+2]
        date = lignes[i*4+3]

        #Texte de confirmation
        Label(t2, text ="Etes-vous sûr de vouloir effacer " + nom + " emprunté par " + emprunteur + " le " + date).pack()

        #Boutons
        Button(t2, text ="Oui", command = enleve).pack()
        Button(t2, text="Annuler", command = t2.destroy).pack()




    def creer(self):
        '''Fonction qui écrit la nouvelle entrée de l'utilisatieur dans le fichier'''
        #On ouvre le fichier en écriture et on y rajoute les datas sous la forme (pour chauque élément) : 
        # % 
        # nom
        # emprunteur
        # date
        fichier = open(self.banque, 'a')
        fichier.write('%\n' + self.entree_nom  + '\n' + self.entree_emprunteur  + '\n' + self.entree_date + '\n' )
        fichier.close()

        #On reload ensuite la liste pour rajouter le nouvel élément
        self.rafraichir_liste() 



    def efface(self):
        '''Fonction qui efface l'entrée active dans le fichier'''
        #On récupère le bon index et on efface les lignes correspondantes        
        i = int(self.actif[0])        
        effacerLignes(self.banque, i*4 + 1)
        
        #On reload la liste pour en enlever l'élément qu'on vient d'effacer 
        self.rafraichir_liste()
        
        #On vide les entrées puisqu'il n'y a plus d'élément sélectionné
        self.champEmprunteur.configure( text= "")
        self.champDate.configure( text= "")
    








########################################################################################
##################      Corps                            ###############################
########################################################################################



if __name__ == '__main__':
   Application().mainloop()

J'ai utilisé Tkinter, donc ce n'est pas graphiquement superbe, mais on commence avec ce qu'on peut ^^.
J'espère que ça pourra servir à  quelqu'un smile
Je suis évidemment super ouvert à  toutes les remarques, idées, invitations à  des parties de poker, ... Comme j'apprends seulement le python, je suis sûr que mon code comporte pleiiiiiiiiin d'absurdités et de bêtises, alors n'hésitez pas à  m'en faire part !

PS : comme c'est la première fois que je partage un truc qui dépasse les 4 lignes, je ne sais pas si j'ai fait ce qu'il faut point de vue licence. à‰crire juste GPL c'est suffisant ?

Dernière modification par Instanton (Le 05/01/2008, à 14:39)

Hors ligne

#2 Le 05/01/2008, à 14:59

Ghost33

Re : Gestionnaire de prets

Ho le radin !
non tapez pas c'était pour rire yikes

Hors ligne

#3 Le 06/01/2008, à 10:03

Instanton

Re : Gestionnaire de prets

Moi radin sad Jamais ! (c'est pas du Kagain de BG2 ça ? ^^)

Hors ligne