Pages : 1
#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 ! ) 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à .
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
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
Ma musique ici => https://nicolas-merle.bandcamp.com/
Hors ligne
#3 Le 06/01/2008, à 10:03
- Instanton
Re : Gestionnaire de prets
Moi radin Jamais ! (c'est pas du Kagain de BG2 ça ? ^^)
Hors ligne
Pages : 1