Accueil > > > BIBLIO : GESTIONNAIRE DE BIBLIOTHÈQUE
BIBLIO : GESTIONNAIRE DE BIBLIOTHÈQUE
Information sur la source
Description
Gestionnaire de bibliothèque permettant l'enregistrement des ouvrages puis la recherche d'ouvrages à partir de n'importe quel élément de n'importe quel critère (auteur, titre, catégorie...etc) Le résulat des recherches : listes partielle ou complètes peuvent être imprimée en faisant apparaitre le critère de sélection. Il n'y a pas de limite au nombre d'ouvrages pouvant être enregistrés.
Source
- # Biblio avec appel sous-prog impression
- # -*- coding: utf-8 -*-
- from Tkinter import *
- from winsound import *
- import sqlite3
- import string
- import os
- import sys
-
- # lors de la création d'un exe pour windows, sys.setdefaultencoding peut être détruit par site.py
- # à l'exécution de py2exe ; il faut donc le restaurer.
- reload(sys)
- if hasattr(sys,"setdefaultencoding") :
- sys.setdefaultencoding("utf-8")
-
- global b, attendre,imod
- b=" "
- attendre=True
- infends=0
- doclas=""
- imod=False
-
- def impression() :
- global reqsql,titlist,typdem
- cur.execute("update param set req='%s',tit='%s',dem='%s' where num='%s' " % (reqsql,titlist,typdem,1))
- cx.commit()
- # sous windows si encapsulation par py2exe, changer le .pyw en .exe
- #retcode = os.popen("imprimbiblio.pyw","r")
- retcode = os.popen("imprimbiblio.exe","r")
-
- def visualiser() :
- global typdem
- typdem='V'
- impression()
-
- def imprimer() :
- global typdem
- typdem='I'
- impression()
-
- # création de la table biblio si elle n'existe pas
- def init() :
- try :
- cur.execute("select * from biblio")
- except :
- cur.execute("create table biblio (num integer primary key, titre char(50), auth char(30), edit char(30), typ char(15), genre char(15), clast char(6), note char(50))")
- cur.execute("create unique index X1_biblio on biblio (num)")
- cur.execute("create index X2_biblio on biblio (titre)")
- cx.commit()
- cur.execute("create table param (num integer primary key, req char(200), tit char(150), dem char(1))")
- cur.execute("insert into param (num,req,tit,dem) values (1,'vide','vide','*')")
- cx.commit()
-
- def champs_inactifs() :
- benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- etitre.config(state=DISABLED)
- eauth.config(state=DISABLED)
- eedit.config(state=DISABLED)
- etyp.config(state=DISABLED)
- egenre.config(state=DISABLED)
- eclast.config(state=DISABLED)
- enote.config(state=DISABLED)
-
- def champs_actifs() :
- etitre.config(state=NORMAL)
- eauth.config(state=NORMAL)
- eedit.config(state=NORMAL)
- etyp.config(state=NORMAL)
- egenre.config(state=NORMAL)
- eclast.config(state=NORMAL)
- enote.config(state=NORMAL)
-
- def controle() :
- global titre,auth,edit,typ,genre,clast,note,imess
- global titds,authds,editds,typds,genreds,clastds,noteds
- imess=0
- titre=etitre.get()
- if len(titre)>50 :
- mess1.configure(text='titre limité à 50 caractères')
- titre=titre[0:50]
- imess=1
- auth=eauth.get()
- if len(auth)>30 :
- mess1.configure(text='auteur limité à 30 caractères',fg='red')
- auth=auth[0:30]
- imess=1
- elif len(auth)==1 and auth[0]=='*' :
- auth=authds
- edit=eedit.get()
- if len(edit)>30 :
- mess1.configure(text='editeur limité à 30 caractères',fg='red')
- edit=edit[0:30]
- imess=1
- elif len(edit)==1 and edit[0]=='*' :
- edit=editds
- typ=etyp.get()
- if len(typ)>15 :
- mess1.configure(text='type limité à 15 caractères',fg='red')
- typ=typ[0:15]
- imess=1
- elif len(typ)==1 and typ[0]=='*' :
- typ=typds
- genre=egenre.get()
- if len(genre)>15 :
- mess1.configure(text='genre limité à 15 caractères',fg='red')
- genre=genre[0:15]
- imess=1
- elif len(genre)==1 and genre[0]=='*' :
- genre=genreds
- clast=eclast.get()
- if len(clast)>6 :
- mess1.configure(text='classement limité à 6 caractères',fg='red')
- clast=clast[0:6]
- imess=1
- elif len(clast)==1 and clast[0]=='*' :
- clast=clastds
- note=enote.get()
- if len(note)>50 :
- mess1.configure(text='notes limité à 50 caractères',fg='red')
- note=note[0:50]
- imess=1
- elif len(note)==1 and note[0]=='*' :
- note=noteds
- if imess==1 :
- Beep(100,50)
-
- def enregistrer_enter(e) :
- if imod==False :
- enregistrer()
-
- def enregistrer() :
- global doclas
- controle()
- if imess==0 and titre <>"" :
- try :
- cur.execute("select clast from biblio where titre='%s' " %titre)
- doclas = cur.fetchone()[0]
- mess2.configure(text="< "+titre+" > se trouve déjà en "+doclas,fg='red')
- Beep(500,50)
- Beep(400,50)
- except : doclas=""
- try :
- cur.execute("insert into biblio (titre,auth,edit,typ,genre,clast,note) values (?,?,?,?,?,?,?)",
- (titre,auth,edit,typ,genre,clast,note))
- cx.commit()
- mess1.configure(text="Données enregistrées",fg='darkgreen')
- champs_inactifs()
- derniere_saisie()
- nouveau()
- except :
- mess1.configure(text="Erreur lors de l'enregistrement",fg='red')
- Beep(100,50)
-
- def effacer() :
- global doclas
- etitre.delete(0,END)
- eauth.delete(0,END)
- eedit.delete(0,END)
- etyp.delete(0,END)
- egenre.delete(0,END)
- eclast.delete(0,END)
- enote.delete(0,END)
- if doclas=="" :
- mess2.configure(text='')
-
-
- def derniere_saisie() :
- global titds,authds,editds,typds,genreds,clastds,noteds,infends,textds,el
- if infends==0 :
- info_saisie()
- textds.delete(1.0, END)
- textds.insert(END,"Dernier ouvrage enregistré","b")
- cur.execute("select count (*) from biblio")
- nbtit=cur.fetchone()[0]
- if nbtit>0 :
- textds.insert(END," Nombre de livres dans la base : "+str(nbtit)+"\n","c")
- cur.execute("select max (num) from biblio")
- el = cur.fetchone()[0]
- cur.execute("select titre,auth,edit,typ,genre,clast,note from biblio where num= '%s' " % el)
- chain=''
- row= cur.fetchone()
- titds=row[0]
- authds=row[1]
- editds=row[2]
- typds=row[3]
- genreds=row[4]
- clastds=row[5]
- noteds=row[6]
- chain="Titre : "+titds+'\n'+"Auteur : "+authds+'\n'+"Editeur : "+editds+'\n'+"Type : "+typds+'\n'+"Genre : "+genreds+'\n'+"Classement : "+clastds+'\n'+"Notes : "+noteds
- textds.insert(END,chain,"a")
-
- def corr_dernsai() :
- global el
- ferme_fends()
- aff_modif(el)
-
- def nouveau() :
- global imod
- derniere_saisie()
- champs_actifs()
- effacer()
- imod=False
- etitre.focus_set()
- benre.config(text='Enregistrer',bg='lightgreen',state=NORMAL,relief=RAISED)
- etitre.bind('<Return>', enregistrer_enter)
- eauth.bind('<Return>', enregistrer_enter)
- eedit.bind('<Return>', enregistrer_enter)
- etyp.bind('<Return>', enregistrer_enter)
- egenre.bind('<Return>', enregistrer_enter)
- eclast.bind('<Return>', enregistrer_enter)
- enote.bind('<Return>', enregistrer_enter)
- tit01.configure(text='Compléter les champs puis [Enregistrer]\n * signifie identique au dernier ouvrage enregistré',fg='black')
- bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
-
- def chercher() :
- global imod
- champs_actifs()
- effacer()
- imod=False
- tit01.configure(text="Taper une syllabe, un mot ou une partie du champ de recherche\n puis [Ok]",fg='black')
- enote.config(state=DISABLED)
- bok.config(text='Ok',bg='lightgreen',fg='darkgreen',state=NORMAL,relief=RAISED,command=recherche)
- benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- etitre.focus_set()
- etitre.bind('<Return>', recherche_enter)
- eauth.bind('<Return>', recherche_enter)
- eedit.bind('<Return>', recherche_enter)
- etyp.bind('<Return>', recherche_enter)
- egenre.bind('<Return>', recherche_enter)
- eclast.bind('<Return>', recherche_enter)
- ferme_fends()
-
- def recherche_enter(e) :
- global imod
- if imod==False :
- recherche()
-
- def recherche() :
- global titre,auth,edit,typ,genre,clast,note,imess,fen3,list2,fram3,reqsql,titlist
- fen3 = Toplevel()
- fen3.geometry("1230x490+20+200")
- fen3.resizable(width=False, height=False)
- fen3.title("Résultat de la recherche")
- fram3=Frame(fen3,borderwidth=0)
- lab3=Label(fram3,text='', fg='darkgreen', font=('Arial', 11))
- lab3.pack(side=TOP)
- lab4=Label(fram3,text='Titre Auteur Editeur Type / Notes Genre Classement ',
- fg='brown', font=('Arial',8))
- lab4.pack(side=TOP)
- scrolly =Scrollbar(fram3,orient=VERTICAL)
- list2 = Listbox(fram3,bg="#f1dda0",width=169,height=30, yscrollcommand=scrolly.set, font=('Lucida Console', 9))
- scrolly.config(command = list2.yview)
- scrolly.pack(side=LEFT,fill=Y)
- list2.pack()
- list2.select_set(0)
- list2.bind('<ButtonRelease>',modif2)
- list2.focus()
- fram3.place(x=15,y=0)
- bimp2=Button(fen3, text='Imprimer', command=imprimer,bg="lightblue", fg='blue')
- bimp2.place(x=450,y=450)
- bvisu2=Button(fen3, text='Visualiser', command=visualiser,bg="lightblue", fg='blue')
- bvisu2.place(x=530,y=450)
- bfer3=Button(fen3, text="Fermer", command=fen3.destroy,bg='orange', fg='brown')
- bfer3.place(x=750,y=450)
- fen3.grab_set()
- controle()
- if imess==0 :
- para1=""
- if titre <>'' :
- para1="titre"
- para2="titre"
- var = '%'+titre+'%'
- elif auth <>'' :
- para1="auth"
- para2="auteur"
- var='%'+auth+'%'
- elif edit <>'' :
- para1="edit"
- para2="éditeur"
- var='%'+edit+'%'
- elif typ <>'' :
- para1="typ"
- para2="type"
- var='%'+typ+'%'
- elif genre <>'' :
- para1="genre"
- para2="genre"
- var='%'+genre+'%'
- elif clast <>'' :
- para1="clast"
- para2="classement"
- var=clast+'%'
- if para1 =="" :
- mess1.configure(text='Taper un argument de recherche')
- fen3.destroy()
- else :
- nbch=0
- try :
- cur.execute("select num,titre,auth,edit,typ,genre,clast,note from biblio where "+para1+" like \'%s\' order by titre" %var)
- for row in cur :
- rnum=str(row[0])
- chaine1=construire_chaine(row)
- list2.insert(END,chaine1)
- chaine1=b+b+b[0:20]+str(row[7])
- list2.insert(END,chaine1)
- nbch=nbch+1
- mess1.configure(text='')
- var2=var[1:len(var)-1]
- reqsql="select titre,auth,edit,typ,genre,clast,note from biblio where "+para1+" like \'\'%s\'\' order by titre" %var
- titlist="Liste des livres ayant un "+para2+" contenant < "+var2+" > ("+str(nbch)+" livres)"
- lab3.configure(text=titlist)
- except :
- mess1.configure(text='Argument de recherche non valide')
- etitre.delete(0,END)
- eauth.delete(0,END)
- eedit.delete(0,END)
- etyp.delete(0,END)
- egenre.delete(0,END)
- eclast.delete(0,END)
- enote.delete(0,END)
-
- def construire_chaine(row) :
- rnum=str(row[0])
- rtitre=str(row[1])
- rtitre1=rtitre.decode('utf-8')
- rauth=str(row[2])
- rauth1=rauth.decode('utf-8')
- redit=str(row[3])
- redit1=redit.decode('utf-8')
- rtyp=str(row[4])
- rtyp1=rtyp.decode('utf-8')
- rgenre=str(row[5])
- rgenre1=rgenre.decode('utf-8')
- rclast=str(row[6])
- rclast1=rclast.decode('utf-8')
- chaine= (rnum+b[0:5-len(rnum)]+rtitre+b[0:51-len(rtitre1)]+rauth+b[0:31-len(rauth1)]+redit+b[0:31-len(redit1)]
- +rtyp+b[0:16-len(rtyp1)]+rgenre+b[0:16-len(rgenre1)]+rclast+b[0:7-len(rclast1)])
- return chaine
-
- def lister() :
- global vartri,fentri
- vartri= StringVar()
- fentri=Toplevel()
- fentri.config(bg='lightgreen')
- geo1=fen1.winfo_geometry()
- geox=fen1.winfo_rootx()
- geoy=fen1.winfo_rooty()
- fentri.geometry("200x175+"+str(geox+28)+"+"+str(geoy+75))
- fentri.resizable(width=False, height=False)
- fentri.title("Liste complète")
- laqu1=Label(fentri,text="Choisissez l'ordre de tri", fg='black',bg='lightgreen', font=('Arial', 10))
- laqu1.pack(side=TOP)
- Radiobutton(fentri,text=" titre ",variable=vartri,value="titre",command=choixtri).pack()
- Radiobutton(fentri,text=" auteur ",variable=vartri,value="auth",command=choixtri).pack()
- Radiobutton(fentri,text=" éditeur ",variable=vartri,value="edit",command=choixtri).pack()
- Radiobutton(fentri,text=" genre ",variable=vartri,value="genre",command=choixtri).pack()
- Radiobutton(fentri,text="classement",variable=vartri,value="clast",command=choixtri).pack()
- Button(fentri, text="Annuler", command=fentri.destroy,bg='orange', fg='brown').pack(side=BOTTOM,pady=10)
- fentri.grab_set()
-
- def choixtri() :
- global vartri,fentri
- argt=vartri.get()
- fentri.destroy()
- listertrier(argt)
-
- def listertrier(argt) :
- global list1, fen2,reqsql,titlist
- fen2 = Toplevel()
- fen2.geometry("1230x480+20+200")
- fen2.resizable(width=False, height=False)
- vtri=argt
- if argt=='auth' :
- vtri='auteur, titre'
- argt='auth,titre'
- if argt=='edit' :
- vtri='éditeur, titre'
- argt='edit,titre'
- if argt=='genre' :
- vtri='genre, titre'
- argt='genre,titre'
- if argt=='clast' :
- vtri='classement, titre'
- argt='clast,titre'
- fen2.title("Liste complète de la bibliothèque triée par %s" %vtri)
- fram2=Frame(fen2,borderwidth=0)
- lab1=Label(fram2,text='', fg='blue', font=('Arial', 11))
- lab1.pack(side=TOP)
- lab2=Label(fram2,text='Titre Auteur Editeur Type / Notes Genre Classement ',
- fg='brown', font=('Arial',8))
- lab2.pack(side=TOP)
- scrolly =Scrollbar(fram2,orient=VERTICAL)
- list1 = Listbox(fram2,bg="#bebfeb",width=169,height=30,selectmode='single', yscrollcommand=scrolly.set, font=('Lucida Console', 9))
- scrolly.config(command = list1.yview)
- scrolly.pack(side=LEFT,fill=Y)
- list1.pack()
- list1.select_set(0)
- list1.bind('<ButtonRelease>',modif1)
- list1.focus()
- fram2.place(x=15,y=0)
- bimp=Button(fen2, text='Imprimer', command=imprimer,bg="lightblue", fg='blue')
- bimp.place(x=450,y=450)
- bvisu=Button(fen2, text='Visualiser', command=visualiser,bg="lightblue", fg='blue')
- bvisu.place(x=530,y=450)
- bfer2=Button(fen2, text="Fermer", command=fen2.destroy,bg='orange', fg='brown')
- bfer2.place(x=750,y=450)
- champs_actifs()
- effacer()
- nbliv=0
- reqsql="select num,titre,auth,edit,typ,genre,clast,note from biblio order by %s" %argt
- cur.execute(reqsql)
- for row in cur:
- rnum=str(row[0])
- chaine1=construire_chaine(row)
- list1.insert(END,chaine1)
- chaine1=b+b+b[0:20]+str(row[7])
- list1.insert(END,chaine1)
- nbliv=nbliv+1
- champs_inactifs()
- tit01.configure(text=' \n ')
- reqsql="select titre,auth,edit,typ,genre,clast,note from biblio order by %s" %argt
- titlist="Liste complète de la bibliothèque par "+vtri+" ("+str(nbliv)+" livres)"
- lab1.configure(text='Cliquer sur une ligne pour la modifier ou la supprimer ('+str(nbliv)+' livres)')
- fen2.grab_set()
- ferme_fends()
-
- def modif1(e) :
- global fram1
- i=list1.curselection()
- ligne=list1.get(i)
- if ligne[0:5]==" " :
- pass
- else :
- fen2.destroy()
- modifier(ligne)
-
- def modif2(e) :
- global fram3
- i=list2.curselection()
- ligne=list2.get(i)
- if ligne[0:5]==" " :
- pass
- else :
- fen3.destroy()
- bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- modifier(ligne)
-
- def modifier(ligne) :
- global el
- champs_actifs()
- el = '0'
- for e in ligne :
- if e == ' ' :
- break
- else : el = el+e
- aff_modif(el)
-
- def aff_modif(el) :
- global imod
- imod=True
- cur.execute("select titre,auth,edit,typ,genre,clast,note from biblio where num='%s' " % el)
- for row in cur:
- chaine= str(row[0])
- etitre.insert(1,chaine)
- chaine= str(row[1])
- eauth.insert(1,chaine)
- chaine= str(row[2])
- eedit.insert(1,chaine)
- chaine= str(row[3])
- etyp.insert(1,chaine)
- chaine= str(row[4])
- egenre.insert(1,chaine)
- chaine= str(row[5])
- eclast.insert(1,chaine)
- chaine= str(row[6])
- enote.insert(1,chaine)
- benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
- bmodif.config(text='Modifier ',bg='lightgreen',fg='darkgreen',state=NORMAL,relief=RAISED)
- bsupp.config(text='Supprimer',bg='pink',fg='brown',state=NORMAL,relief=RAISED)
- tit01.configure(text='[Supprimer] pour supprimer la ligne\nou alors modifier les champs voulus puis [Modifier]',fg='black')
-
- def update() :
- global el,titre,auth,edit,typ,genre,clast,note,imess,imod
- controle()
- if imess==0 :
- if titre <>"" and el> 0 :
- titre1=""
- for i in titre :
- titre1=titre1+i
- if i=="'" :
- titre1=titre1+i
- auth1=""
- for i in auth :
- auth1=auth1+i
- if i=="'" :
- auth1=auth1+i
- edit1=""
- for i in edit :
- edit1=edit1+i
- if i=="'" :
- edit1=edit1+i
- typ1=""
- for i in typ :
- typ1=typ1+i
- if i=="'" :
- typ1=typ1+i
- genre1=""
- for i in genre :
- genre1=genre1+i
- if i=="'" :
- genre1=genre1+i
- note1=""
- for i in note :
- note1=note1+i
- if i=="'" :
- note1=note1+i
- try :
- cur.execute("update biblio set titre='%s',auth='%s',edit='%s',typ='%s',genre='%s',clast='%s',note='%s' where num='%s' " % (titre1,auth1,edit1,typ1,genre1,clast,note1,el))
- cx.commit()
- mess1.configure(text='Modification enregistrée',fg='darkgreen')
- champs_inactifs()
- except :
- mess1.configure(text='Erreur : Modif non enregistrée',fg='red')
- Beep(100,50)
- elem=0
- imod=False
-
- def supprimer() :
- tit01.configure(text="[Ok] pour confirmer la suppression\n ",fg='red')
- champs_inactifs()
- bok.config(text=' Ok ',bg='pink',fg='brown',state=NORMAL,relief=RAISED,command=delete)
- Beep(800,30)
-
- def delete() :
- global el
- if el>0 :
- cur.execute("delete from biblio where num='%s' " % el)
- cx.commit()
- mess1.configure(text='Ligne supprimée')
- tit01.configure(text='')
- el=0
- champs_inactifs()
-
- def ferme_fends() :
- global infends,fends
- if infends==1 :
- fends.destroy()
- infends=0
-
- def info_saisie() :
- global infends,textds,fends
- fends = Toplevel()
- fends.config(bg='gold')
- geo1=fen1.winfo_geometry()
- geox=fen1.winfo_rootx()
- geoy=fen1.winfo_rooty()
- fends.geometry("530x140+"+str(geox)+"+"+str(geoy+378))
- fends.resizable(width=False, height=False)
- fends.overrideredirect(1)
- textds=Text(fends,width=86,height=10)
- textds.tag_config("a", foreground="blue",font=('Arial', 10))
- textds.tag_config("b", foreground="brown",font=('Arial', 10), underline=1)
- textds.tag_config("c", foreground="black",font=('Arial', 9))
- textds.place(x=3,y=2)
- bouds=Button(fends, text="Fermer", command=ferme_fends,bg="orange", fg='brown')
- bouds.place(x=480,y=110)
- bmods=Button(fends, text="Corriger", command=corr_dernsai,bg="lightblue", fg='blue')
- bmods.place(x=475,y=80)
- infends=1
-
- def infos(e) :
- global feninf
- feninf = Toplevel()
- feninf.config(bg='lightblue')
- geo1=fen1.winfo_geometry()
- geox=fen1.winfo_rootx()
- geoy=fen1.winfo_rooty()
- feninf.geometry("560x530+"+str(geox-20)+"+"+str(geoy-30))
- feninf.resizable(width=False, height=False)
- feninf.title("À propos de Biblio")
- labinf1=Label(feninf,bg='lightblue', fg='black',width=70,font=('Arial', 9),
- text= "\nBiblio v.1.2\n\n"
- "Programme écrit en Python / Tkinter / SQLite \n"
- "et distribué sous licence GNU GPL.\n\n"
- "© 2008 Yves Le Chevalier\n"
- "( yveslechevalier@free.fr )")
- labinf1.pack()
- labinf2=Label(feninf,bg='lightblue', fg='black',width=71,font=('Arial', 9),justify=LEFT,
- text= "Ce programme permet d'enregistrer les livres d'une bibliothèque afin de retrouver\n"
- "facilement un ouvrage à partir de son titre ou de son auteur. Il permet aussi de\n"
- "regrouper les livres par éditeur, par genre ou par emplacement et d'en faire l'impression.\n"
- "NB : Il est indissociable du programme 'ImprimBiblio' qui gère l'impression.\n\n"
- "AIDE :\n"
- "La [Liste complète] affiche la liste intégrale de tous les ouvrages triés par titre,\n"
- "par auteur, par éditeur, par genre ou par classement selon la demande.\n\n"
- "[Chercher] permet d'obtenir la liste des ouvrages correspondant à une syllabe ou\n"
- "un mot contenu dans le titre, l'auteur, l'éditeur, le genre, le classement ou le type.\n\n"
- "Lorsqu'une liste est affichée, on peut soit en faire l'impression, soit modifier ou\n"
- "supprimer une ligne en cliquant sur celle-ci dans la liste.\n\n"
- "En saisie (sauf pour le titre), taper * pour attribuer à un champ la même valeur que\n"
- "celle du champ correspondant du dernier ouvrage enregistré (affiché en bas de la fenêtre)\n\n"
- "Utiliser un classement par pièce, meuble et rayonnage par exemple, ou autre codification\n"
- "à votre convenance en fonction du mode de stockage des livres. Conserver cependant\n"
- "à gauche le plus grand élément et à droite le plus petit afin de faciliter les recherches.")
- labinf2.pack(pady=20)
- bouf3=Button(feninf, text="Fermer", command=feninf.destroy,bg="orange", fg='brown')
- bouf3.pack(side=BOTTOM,pady=10)
- restau_curseur()
- feninf.grab_set()
-
- def curseur_main(e) :
- global fenbul
- fen1.config(cursor='hand2')
- fenbul=Toplevel()
- fenbul.config(bg='yellow')
- geo1=fen1.winfo_geometry()
- geox=fen1.winfo_rootx()
- geoy=fen1.winfo_rooty()
- fenbul.geometry("90x19+"+str(geox+465)+"+"+str(geoy+320))
- fenbul.resizable(width=False, height=False)
- fenbul.overrideredirect(1)
- labbul=Label(fenbul,bg='yellow', fg='black',width=15,font=('Arial', 8),text="A propos + Aide",relief=RIDGE)
- labbul.pack()
-
- def curseur_fleche(e) :
- restau_curseur()
-
- def restau_curseur() :
- global fenbul
- fen1.config(cursor='arrow')
- fenbul.destroy()
-
- def quitter_prog() :
- global fenqui
- fenqui=Toplevel()
- fenqui.config(bg='yellow',bd=3,relief='groove')
- geo1=fen1.winfo_geometry()
- geox=fen1.winfo_rootx()
- geoy=fen1.winfo_rooty()
- fenqui.geometry("150x60+"+str(geox+220)+"+"+str(geoy+160))
- fenqui.resizable(width=False, height=False)
- fenqui.overrideredirect(1)
- labqui=Label(fenqui,bg='yellow',fg='red',font=('Arial', 12),text="Quitter Biblio ?")
- labqui.place(x=17,y=1)
- repon=StringVar()
- bououi=Button(fenqui,text="Oui", bg='pink', fg='black',command=confir_quitter)
- bounon=Button(fenqui,text="Non", bg='pink', fg='black',command=continu_prog)
- bououi.place(x=20,y=25)
- bounon.place(x=90,y=25)
- fenqui.grab_set()
-
- def confir_quitter() :
- fen1.destroy()
-
- def continu_prog() :
- global fenqui
- fenqui.destroy()
-
- # main
- cx = sqlite3.connect("biblio.db3")
- cur = cx.cursor()
- init()
-
- fen1 = Tk(className='biblio')
- fen1.resizable(width=False, height=False)
- fen1.geometry("530x375+400+300")
- fram1=Frame(fen1,bg='grey',bd=5,relief='ridge')
- tit0=Label(fen1, text='Biblio',fg='black',bg='lightyellow',font=('Arial', 20))
- tit0.place(x=10,y=10)
- tit01=Label(fram1, text=' \n ',bg='grey',fg='black', font=('Arial', 9),width=60)
- tit01.place(x=80,y=30)
- tit1=Label(fram1, text='Titre : ',bg='grey').place(x=20,y=70)
- tit2=Label(fram1, text='Auteur : ',bg='grey').place(x=20,y=100)
- tit3=Label(fram1, text='Editeur : ',bg='grey').place(x=20,y=130)
- tit4=Label(fram1, text='Type : ',bg='grey').place(x=20,y=160)
- tit5=Label(fram1, text='Genre : ',bg='grey').place(x=20,y=190)
- tit6=Label(fram1, text='Classement : ',bg='grey').place(x=20,y=220)
- tit7=Label(fram1, text='Notes: ',bg='grey').place(x=20,y=250)
- mess1=Label(fram1,text='',bg='grey', fg='red', font=('Arial',10))
- mess1.place(x=20,y=340)
- mess2=Label(fram1,text='',bg='grey', fg='red', font=('Arial',10))
- mess2.place(x=20,y=320)
- etitre = Entry(fram1,state=DISABLED,width=50)
- etitre.place(x=100,y=70)
- eauth= Entry(fram1,state=DISABLED,width=30)
- eauth.place(x=100,y=100)
- eedit = Entry(fram1,state=DISABLED,width=30)
- eedit.place(x=100,y=130)
- etyp = Entry(fram1,state=DISABLED,width=15)
- etyp.place(x=100,y=160)
- egenre = Entry(fram1,state=DISABLED,width=15)
- egenre.place(x=100,y=190)
- eclast = Entry(fram1,state=DISABLED,width=6)
- eclast.place(x=100,y=220)
- enote = Entry(fram1,state=DISABLED,width=50)
- enote.place(x=100,y=250)
-
- can1 = Canvas(fram1, width=20, height=20)
- signat=PhotoImage(file='YLC.gif')
- sign=can1.create_image(12,12, image=signat,tag="ylc")
- can1.tag_bind("ylc","<ButtonRelease>",infos)
- can1.tag_bind("ylc","<Enter>",curseur_main)
- can1.tag_bind("ylc","<Leave>",curseur_fleche)
- can1.place(x=493,y=335)
-
- bok=Button(fram1, text='', command=recherche,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
- bok.place(x=400,y=120)
- bsupp=Button(fram1, text='', command=supprimer,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
- bsupp.place(x=400,y=150)
- bmodif=Button(fram1, text='', command=update,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
- bmodif.place(x=400,y=180)
- benre=Button(fram1, text='', command=enregistrer,bg='grey', fg='darkgreen',state=DISABLED,relief=FLAT)
- benre.place(x=400,y=210)
-
- blist=Button(fram1, text='Liste complète', command=lister, bg='lightblue', fg='blue')
- blist.place(x=70,y=290)
- beffa=Button(fram1, text=' Nouvelle saisie', command=nouveau, bg="lightblue", fg='blue')
- beffa.place(x=190,y=290)
- bcher=Button(fram1, text='Chercher', command=chercher,bg="lightblue", fg='blue')
- bcher.place(x=320,y=290)
- bferm=Button(fram1, text='Quitter', command=quitter_prog, bg="pink", fg='black')
- bferm.place(x=420,y=290)
- fram1.pack(fill=BOTH, expand=1)
-
- fen1.mainloop()
- #===========================================================
- #===========================================================
-
-
- #===========================================================
- #===========================================================
-
- #sous-prog d'impression de biblio
- import wx
- import wx.lib.printout as printout
- import sqlite3
-
- class Frame(wx.Frame):
-
- def __init__(self, parent, title) :
- wx.Frame.__init__(self, parent, -1, title,size=((250, 120)))
- panel = wx.Panel(self)
- box1 = wx.StaticBox(panel, -1, u"")
- bsizer1 = wx.StaticBoxSizer(box1, wx.HORIZONTAL)
- bferm = wx.Button(panel, -1, u"Fermer")
- bsizer1.Add(bferm, 10,wx.RIGHT|wx.ALL, 10)
- self.liste = wx.ListCtrl(panel,-1,size=(1000,300),style=wx.LC_REPORT)
- self.Bind(wx.EVT_BUTTON, self.Fermer, bferm)
- sizer = wx.BoxSizer(wx.VERTICAL)
- boit = wx.BoxSizer(wx.HORIZONTAL)
- boit.Add(bsizer1, 0, wx.ALL, 10)
- sizer.Add(boit, 0, wx.ALL|wx.CENTER, 10)
- sizer.Add(self.liste, 1, wx.ALL|wx.CENTER, 0)
- panel.SetSizer(sizer)
- panel.Layout()
- self.Centre()
- self.Imprimer(self)
-
- def RecupDonnees(self,requete) :
- try:
- cur.execute(requete)
- lignes = cur.fetchall()
- return lignes
- except :
- print "erreur RecupDonnees: "
- finally :
- cur.close()
- cx.close()
-
- def Prepareimpri(self):
- lignes = self.RecupDonnees(requete)
- prt = printout.PrintTable(self)
- prt.SetLandscape()
- prt.SetHeader("BIBLIO - "+titre)
- prt.label = [u"Titre", u"Auteur", u"Editeur", u"Type", u"Genre", u"Classt",u"Notes"]
- prt.text_font_size = 7
- prt.set_column =[2.5,1.7,1.3,0.9,0.8,0.6,3.0]
- prt.cell_left_margin = 1.0/32.0
- prt.left_margin=0.2
- prt.data = lignes
- prt.SetFooter(u"Page ", type =u"Num")
-
- return prt
-
- def Imprimer(self, evt):
- global seq, typdem
- if seq==0 :
- seq=1
- prt = self.Prepareimpri()
- if typdem=="V" :
- prt.Preview()
- else :
- prt.Print()
- self.Destroy()
-
- def Fermer(self, evt):
- self.Destroy()
-
- class MyApp(wx.App):
- def OnInit(self):
- frame = Frame(None, u"Impression-Visualisation Biblio")
- self.SetTopWindow(frame)
- frame.Show(True)
- return True
-
- #main
- seq =0
- cx = sqlite3.connect("biblio.db3")
- cx.isolation_level = None
- cur = cx.cursor()
- req1=u"select tit,req,dem from param where num=1"
- cur.execute(req1)
- row=cur.fetchone()
- titre=row[0]
- requete=row[1]
- typdem=row[2]
-
- app = MyApp(True)
- app.MainLoop()
# Biblio avec appel sous-prog impression
# -*- coding: utf-8 -*-
from Tkinter import *
from winsound import *
import sqlite3
import string
import os
import sys
# lors de la création d'un exe pour windows, sys.setdefaultencoding peut être détruit par site.py
# à l'exécution de py2exe ; il faut donc le restaurer.
reload(sys)
if hasattr(sys,"setdefaultencoding") :
sys.setdefaultencoding("utf-8")
global b, attendre,imod
b=" "
attendre=True
infends=0
doclas=""
imod=False
def impression() :
global reqsql,titlist,typdem
cur.execute("update param set req='%s',tit='%s',dem='%s' where num='%s' " % (reqsql,titlist,typdem,1))
cx.commit()
# sous windows si encapsulation par py2exe, changer le .pyw en .exe
#retcode = os.popen("imprimbiblio.pyw","r")
retcode = os.popen("imprimbiblio.exe","r")
def visualiser() :
global typdem
typdem='V'
impression()
def imprimer() :
global typdem
typdem='I'
impression()
# création de la table biblio si elle n'existe pas
def init() :
try :
cur.execute("select * from biblio")
except :
cur.execute("create table biblio (num integer primary key, titre char(50), auth char(30), edit char(30), typ char(15), genre char(15), clast char(6), note char(50))")
cur.execute("create unique index X1_biblio on biblio (num)")
cur.execute("create index X2_biblio on biblio (titre)")
cx.commit()
cur.execute("create table param (num integer primary key, req char(200), tit char(150), dem char(1))")
cur.execute("insert into param (num,req,tit,dem) values (1,'vide','vide','*')")
cx.commit()
def champs_inactifs() :
benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
etitre.config(state=DISABLED)
eauth.config(state=DISABLED)
eedit.config(state=DISABLED)
etyp.config(state=DISABLED)
egenre.config(state=DISABLED)
eclast.config(state=DISABLED)
enote.config(state=DISABLED)
def champs_actifs() :
etitre.config(state=NORMAL)
eauth.config(state=NORMAL)
eedit.config(state=NORMAL)
etyp.config(state=NORMAL)
egenre.config(state=NORMAL)
eclast.config(state=NORMAL)
enote.config(state=NORMAL)
def controle() :
global titre,auth,edit,typ,genre,clast,note,imess
global titds,authds,editds,typds,genreds,clastds,noteds
imess=0
titre=etitre.get()
if len(titre)>50 :
mess1.configure(text='titre limité à 50 caractères')
titre=titre[0:50]
imess=1
auth=eauth.get()
if len(auth)>30 :
mess1.configure(text='auteur limité à 30 caractères',fg='red')
auth=auth[0:30]
imess=1
elif len(auth)==1 and auth[0]=='*' :
auth=authds
edit=eedit.get()
if len(edit)>30 :
mess1.configure(text='editeur limité à 30 caractères',fg='red')
edit=edit[0:30]
imess=1
elif len(edit)==1 and edit[0]=='*' :
edit=editds
typ=etyp.get()
if len(typ)>15 :
mess1.configure(text='type limité à 15 caractères',fg='red')
typ=typ[0:15]
imess=1
elif len(typ)==1 and typ[0]=='*' :
typ=typds
genre=egenre.get()
if len(genre)>15 :
mess1.configure(text='genre limité à 15 caractères',fg='red')
genre=genre[0:15]
imess=1
elif len(genre)==1 and genre[0]=='*' :
genre=genreds
clast=eclast.get()
if len(clast)>6 :
mess1.configure(text='classement limité à 6 caractères',fg='red')
clast=clast[0:6]
imess=1
elif len(clast)==1 and clast[0]=='*' :
clast=clastds
note=enote.get()
if len(note)>50 :
mess1.configure(text='notes limité à 50 caractères',fg='red')
note=note[0:50]
imess=1
elif len(note)==1 and note[0]=='*' :
note=noteds
if imess==1 :
Beep(100,50)
def enregistrer_enter(e) :
if imod==False :
enregistrer()
def enregistrer() :
global doclas
controle()
if imess==0 and titre <>"" :
try :
cur.execute("select clast from biblio where titre='%s' " %titre)
doclas = cur.fetchone()[0]
mess2.configure(text="< "+titre+" > se trouve déjà en "+doclas,fg='red')
Beep(500,50)
Beep(400,50)
except : doclas=""
try :
cur.execute("insert into biblio (titre,auth,edit,typ,genre,clast,note) values (?,?,?,?,?,?,?)",
(titre,auth,edit,typ,genre,clast,note))
cx.commit()
mess1.configure(text="Données enregistrées",fg='darkgreen')
champs_inactifs()
derniere_saisie()
nouveau()
except :
mess1.configure(text="Erreur lors de l'enregistrement",fg='red')
Beep(100,50)
def effacer() :
global doclas
etitre.delete(0,END)
eauth.delete(0,END)
eedit.delete(0,END)
etyp.delete(0,END)
egenre.delete(0,END)
eclast.delete(0,END)
enote.delete(0,END)
if doclas=="" :
mess2.configure(text='')
def derniere_saisie() :
global titds,authds,editds,typds,genreds,clastds,noteds,infends,textds,el
if infends==0 :
info_saisie()
textds.delete(1.0, END)
textds.insert(END,"Dernier ouvrage enregistré","b")
cur.execute("select count (*) from biblio")
nbtit=cur.fetchone()[0]
if nbtit>0 :
textds.insert(END," Nombre de livres dans la base : "+str(nbtit)+"\n","c")
cur.execute("select max (num) from biblio")
el = cur.fetchone()[0]
cur.execute("select titre,auth,edit,typ,genre,clast,note from biblio where num= '%s' " % el)
chain=''
row= cur.fetchone()
titds=row[0]
authds=row[1]
editds=row[2]
typds=row[3]
genreds=row[4]
clastds=row[5]
noteds=row[6]
chain="Titre : "+titds+'\n'+"Auteur : "+authds+'\n'+"Editeur : "+editds+'\n'+"Type : "+typds+'\n'+"Genre : "+genreds+'\n'+"Classement : "+clastds+'\n'+"Notes : "+noteds
textds.insert(END,chain,"a")
def corr_dernsai() :
global el
ferme_fends()
aff_modif(el)
def nouveau() :
global imod
derniere_saisie()
champs_actifs()
effacer()
imod=False
etitre.focus_set()
benre.config(text='Enregistrer',bg='lightgreen',state=NORMAL,relief=RAISED)
etitre.bind('<Return>', enregistrer_enter)
eauth.bind('<Return>', enregistrer_enter)
eedit.bind('<Return>', enregistrer_enter)
etyp.bind('<Return>', enregistrer_enter)
egenre.bind('<Return>', enregistrer_enter)
eclast.bind('<Return>', enregistrer_enter)
enote.bind('<Return>', enregistrer_enter)
tit01.configure(text='Compléter les champs puis [Enregistrer]\n * signifie identique au dernier ouvrage enregistré',fg='black')
bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
def chercher() :
global imod
champs_actifs()
effacer()
imod=False
tit01.configure(text="Taper une syllabe, un mot ou une partie du champ de recherche\n puis [Ok]",fg='black')
enote.config(state=DISABLED)
bok.config(text='Ok',bg='lightgreen',fg='darkgreen',state=NORMAL,relief=RAISED,command=recherche)
benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bmodif.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bsupp.config(text='',bg='grey',state=DISABLED,relief=FLAT)
etitre.focus_set()
etitre.bind('<Return>', recherche_enter)
eauth.bind('<Return>', recherche_enter)
eedit.bind('<Return>', recherche_enter)
etyp.bind('<Return>', recherche_enter)
egenre.bind('<Return>', recherche_enter)
eclast.bind('<Return>', recherche_enter)
ferme_fends()
def recherche_enter(e) :
global imod
if imod==False :
recherche()
def recherche() :
global titre,auth,edit,typ,genre,clast,note,imess,fen3,list2,fram3,reqsql,titlist
fen3 = Toplevel()
fen3.geometry("1230x490+20+200")
fen3.resizable(width=False, height=False)
fen3.title("Résultat de la recherche")
fram3=Frame(fen3,borderwidth=0)
lab3=Label(fram3,text='', fg='darkgreen', font=('Arial', 11))
lab3.pack(side=TOP)
lab4=Label(fram3,text='Titre Auteur Editeur Type / Notes Genre Classement ',
fg='brown', font=('Arial',8))
lab4.pack(side=TOP)
scrolly =Scrollbar(fram3,orient=VERTICAL)
list2 = Listbox(fram3,bg="#f1dda0",width=169,height=30, yscrollcommand=scrolly.set, font=('Lucida Console', 9))
scrolly.config(command = list2.yview)
scrolly.pack(side=LEFT,fill=Y)
list2.pack()
list2.select_set(0)
list2.bind('<ButtonRelease>',modif2)
list2.focus()
fram3.place(x=15,y=0)
bimp2=Button(fen3, text='Imprimer', command=imprimer,bg="lightblue", fg='blue')
bimp2.place(x=450,y=450)
bvisu2=Button(fen3, text='Visualiser', command=visualiser,bg="lightblue", fg='blue')
bvisu2.place(x=530,y=450)
bfer3=Button(fen3, text="Fermer", command=fen3.destroy,bg='orange', fg='brown')
bfer3.place(x=750,y=450)
fen3.grab_set()
controle()
if imess==0 :
para1=""
if titre <>'' :
para1="titre"
para2="titre"
var = '%'+titre+'%'
elif auth <>'' :
para1="auth"
para2="auteur"
var='%'+auth+'%'
elif edit <>'' :
para1="edit"
para2="éditeur"
var='%'+edit+'%'
elif typ <>'' :
para1="typ"
para2="type"
var='%'+typ+'%'
elif genre <>'' :
para1="genre"
para2="genre"
var='%'+genre+'%'
elif clast <>'' :
para1="clast"
para2="classement"
var=clast+'%'
if para1 =="" :
mess1.configure(text='Taper un argument de recherche')
fen3.destroy()
else :
nbch=0
try :
cur.execute("select num,titre,auth,edit,typ,genre,clast,note from biblio where "+para1+" like \'%s\' order by titre" %var)
for row in cur :
rnum=str(row[0])
chaine1=construire_chaine(row)
list2.insert(END,chaine1)
chaine1=b+b+b[0:20]+str(row[7])
list2.insert(END,chaine1)
nbch=nbch+1
mess1.configure(text='')
var2=var[1:len(var)-1]
reqsql="select titre,auth,edit,typ,genre,clast,note from biblio where "+para1+" like \'\'%s\'\' order by titre" %var
titlist="Liste des livres ayant un "+para2+" contenant < "+var2+" > ("+str(nbch)+" livres)"
lab3.configure(text=titlist)
except :
mess1.configure(text='Argument de recherche non valide')
etitre.delete(0,END)
eauth.delete(0,END)
eedit.delete(0,END)
etyp.delete(0,END)
egenre.delete(0,END)
eclast.delete(0,END)
enote.delete(0,END)
def construire_chaine(row) :
rnum=str(row[0])
rtitre=str(row[1])
rtitre1=rtitre.decode('utf-8')
rauth=str(row[2])
rauth1=rauth.decode('utf-8')
redit=str(row[3])
redit1=redit.decode('utf-8')
rtyp=str(row[4])
rtyp1=rtyp.decode('utf-8')
rgenre=str(row[5])
rgenre1=rgenre.decode('utf-8')
rclast=str(row[6])
rclast1=rclast.decode('utf-8')
chaine= (rnum+b[0:5-len(rnum)]+rtitre+b[0:51-len(rtitre1)]+rauth+b[0:31-len(rauth1)]+redit+b[0:31-len(redit1)]
+rtyp+b[0:16-len(rtyp1)]+rgenre+b[0:16-len(rgenre1)]+rclast+b[0:7-len(rclast1)])
return chaine
def lister() :
global vartri,fentri
vartri= StringVar()
fentri=Toplevel()
fentri.config(bg='lightgreen')
geo1=fen1.winfo_geometry()
geox=fen1.winfo_rootx()
geoy=fen1.winfo_rooty()
fentri.geometry("200x175+"+str(geox+28)+"+"+str(geoy+75))
fentri.resizable(width=False, height=False)
fentri.title("Liste complète")
laqu1=Label(fentri,text="Choisissez l'ordre de tri", fg='black',bg='lightgreen', font=('Arial', 10))
laqu1.pack(side=TOP)
Radiobutton(fentri,text=" titre ",variable=vartri,value="titre",command=choixtri).pack()
Radiobutton(fentri,text=" auteur ",variable=vartri,value="auth",command=choixtri).pack()
Radiobutton(fentri,text=" éditeur ",variable=vartri,value="edit",command=choixtri).pack()
Radiobutton(fentri,text=" genre ",variable=vartri,value="genre",command=choixtri).pack()
Radiobutton(fentri,text="classement",variable=vartri,value="clast",command=choixtri).pack()
Button(fentri, text="Annuler", command=fentri.destroy,bg='orange', fg='brown').pack(side=BOTTOM,pady=10)
fentri.grab_set()
def choixtri() :
global vartri,fentri
argt=vartri.get()
fentri.destroy()
listertrier(argt)
def listertrier(argt) :
global list1, fen2,reqsql,titlist
fen2 = Toplevel()
fen2.geometry("1230x480+20+200")
fen2.resizable(width=False, height=False)
vtri=argt
if argt=='auth' :
vtri='auteur, titre'
argt='auth,titre'
if argt=='edit' :
vtri='éditeur, titre'
argt='edit,titre'
if argt=='genre' :
vtri='genre, titre'
argt='genre,titre'
if argt=='clast' :
vtri='classement, titre'
argt='clast,titre'
fen2.title("Liste complète de la bibliothèque triée par %s" %vtri)
fram2=Frame(fen2,borderwidth=0)
lab1=Label(fram2,text='', fg='blue', font=('Arial', 11))
lab1.pack(side=TOP)
lab2=Label(fram2,text='Titre Auteur Editeur Type / Notes Genre Classement ',
fg='brown', font=('Arial',8))
lab2.pack(side=TOP)
scrolly =Scrollbar(fram2,orient=VERTICAL)
list1 = Listbox(fram2,bg="#bebfeb",width=169,height=30,selectmode='single', yscrollcommand=scrolly.set, font=('Lucida Console', 9))
scrolly.config(command = list1.yview)
scrolly.pack(side=LEFT,fill=Y)
list1.pack()
list1.select_set(0)
list1.bind('<ButtonRelease>',modif1)
list1.focus()
fram2.place(x=15,y=0)
bimp=Button(fen2, text='Imprimer', command=imprimer,bg="lightblue", fg='blue')
bimp.place(x=450,y=450)
bvisu=Button(fen2, text='Visualiser', command=visualiser,bg="lightblue", fg='blue')
bvisu.place(x=530,y=450)
bfer2=Button(fen2, text="Fermer", command=fen2.destroy,bg='orange', fg='brown')
bfer2.place(x=750,y=450)
champs_actifs()
effacer()
nbliv=0
reqsql="select num,titre,auth,edit,typ,genre,clast,note from biblio order by %s" %argt
cur.execute(reqsql)
for row in cur:
rnum=str(row[0])
chaine1=construire_chaine(row)
list1.insert(END,chaine1)
chaine1=b+b+b[0:20]+str(row[7])
list1.insert(END,chaine1)
nbliv=nbliv+1
champs_inactifs()
tit01.configure(text=' \n ')
reqsql="select titre,auth,edit,typ,genre,clast,note from biblio order by %s" %argt
titlist="Liste complète de la bibliothèque par "+vtri+" ("+str(nbliv)+" livres)"
lab1.configure(text='Cliquer sur une ligne pour la modifier ou la supprimer ('+str(nbliv)+' livres)')
fen2.grab_set()
ferme_fends()
def modif1(e) :
global fram1
i=list1.curselection()
ligne=list1.get(i)
if ligne[0:5]==" " :
pass
else :
fen2.destroy()
modifier(ligne)
def modif2(e) :
global fram3
i=list2.curselection()
ligne=list2.get(i)
if ligne[0:5]==" " :
pass
else :
fen3.destroy()
bok.config(text='',bg='grey',state=DISABLED,relief=FLAT)
modifier(ligne)
def modifier(ligne) :
global el
champs_actifs()
el = '0'
for e in ligne :
if e == ' ' :
break
else : el = el+e
aff_modif(el)
def aff_modif(el) :
global imod
imod=True
cur.execute("select titre,auth,edit,typ,genre,clast,note from biblio where num='%s' " % el)
for row in cur:
chaine= str(row[0])
etitre.insert(1,chaine)
chaine= str(row[1])
eauth.insert(1,chaine)
chaine= str(row[2])
eedit.insert(1,chaine)
chaine= str(row[3])
etyp.insert(1,chaine)
chaine= str(row[4])
egenre.insert(1,chaine)
chaine= str(row[5])
eclast.insert(1,chaine)
chaine= str(row[6])
enote.insert(1,chaine)
benre.config(text='',bg='grey',state=DISABLED,relief=FLAT)
bmodif.config(text='Modifier ',bg='lightgreen',fg='darkgreen',state=NORMAL,relief=RAISED)
bsupp.config(text='Supprimer',bg='pink',fg='brown',state=NORMAL,relief=RAISED)
tit01.configure(text='[Supprimer] pour supprimer la ligne\nou alors modifier les champs voulus puis [Modifier]',fg='black')
def update() :
global el,titre,auth,edit,typ,genre,clast,note,imess,imod
controle()
if imess==0 :
if titre <>"" and el> 0 :
titre1=""
for i in titre :
titre1=titre1+i
if i=="'" :
titre1=titre1+i
auth1=""
for i in auth :
auth1=auth1+i
if i=="'" :
auth1=auth1+i
edit1=""
for i in edit :
edit1=edit1+i
if i=="'" :
edit1=edit1+i
typ1=""
for i in typ :
typ1=typ1+i
if i=="'" :
typ1=typ1+i
genre1=""
for i in genre :
genre1=genre1+i
if i=="'" :
genre1=genre1+i
note1=""
for i in note :
note1=note1+i
if i=="'" :
note1=note1+i
try :
cur.execute("update biblio set titre='%s',auth='%s',edit='%s',typ='%s',genre='%s',clast='%s',note='%s' where num='%s' " % (titre1,auth1,edit1,typ1,genre1,clast,note1,el))
cx.commit()
mess1.configure(text='Modification enregistrée',fg='darkgreen')
champs_inactifs()
except :
mess1.configure(text='Erreur : Modif non enregistrée',fg='red')
Beep(100,50)
elem=0
imod=False
def supprimer() :
tit01.configure(text="[Ok] pour confirmer la suppression\n ",fg='red')
champs_inactifs()
bok.config(text=' Ok ',bg='pink',fg='brown',state=NORMAL,relief=RAISED,command=delete)
Beep(800,30)
def delete() :
global el
if el>0 :
cur.execute("delete from biblio where num='%s' " % el)
cx.commit()
mess1.configure(text='Ligne supprimée')
tit01.configure(text='')
el=0
champs_inactifs()
def ferme_fends() :
global infends,fends
if infends==1 :
fends.destroy()
infends=0
def info_saisie() :
global infends,textds,fends
fends = Toplevel()
fends.config(bg='gold')
geo1=fen1.winfo_geometry()
geox=fen1.winfo_rootx()
geoy=fen1.winfo_rooty()
fends.geometry("530x140+"+str(geox)+"+"+str(geoy+378))
fends.resizable(width=False, height=False)
fends.overrideredirect(1)
textds=Text(fends,width=86,height=10)
textds.tag_config("a", foreground="blue",font=('Arial', 10))
textds.tag_config("b", foreground="brown",font=('Arial', 10), underline=1)
textds.tag_config("c", foreground="black",font=('Arial', 9))
textds.place(x=3,y=2)
bouds=Button(fends, text="Fermer", command=ferme_fends,bg="orange", fg='brown')
bouds.place(x=480,y=110)
bmods=Button(fends, text="Corriger", command=corr_dernsai,bg="lightblue", fg='blue')
bmods.place(x=475,y=80)
infends=1
def infos(e) :
global feninf
feninf = Toplevel()
feninf.config(bg='lightblue')
geo1=fen1.winfo_geometry()
geox=fen1.winfo_rootx()
geoy=fen1.winfo_rooty()
feninf.geometry("560x530+"+str(geox-20)+"+"+str(geoy-30))
feninf.resizable(width=False, height=False)
feninf.title("À propos de Biblio")
labinf1=Label(feninf,bg='lightblue', fg='black',width=70,font=('Arial', 9),
text= "\nBiblio v.1.2\n\n"
"Programme écrit en Python / Tkinter / SQLite \n"
"et distribué sous licence GNU GPL.\n\n"
"© 2008 Yves Le Chevalier\n"
"( yveslechevalier@free.fr )")
labinf1.pack()
labinf2=Label(feninf,bg='lightblue', fg='black',width=71,font=('Arial', 9),justify=LEFT,
text= "Ce programme permet d'enregistrer les livres d'une bibliothèque afin de retrouver\n"
"facilement un ouvrage à partir de son titre ou de son auteur. Il permet aussi de\n"
"regrouper les livres par éditeur, par genre ou par emplacement et d'en faire l'impression.\n"
"NB : Il est indissociable du programme 'ImprimBiblio' qui gère l'impression.\n\n"
"AIDE :\n"
"La [Liste complète] affiche la liste intégrale de tous les ouvrages triés par titre,\n"
"par auteur, par éditeur, par genre ou par classement selon la demande.\n\n"
"[Chercher] permet d'obtenir la liste des ouvrages correspondant à une syllabe ou\n"
"un mot contenu dans le titre, l'auteur, l'éditeur, le genre, le classement ou le type.\n\n"
"Lorsqu'une liste est affichée, on peut soit en faire l'impression, soit modifier ou\n"
"supprimer une ligne en cliquant sur celle-ci dans la liste.\n\n"
"En saisie (sauf pour le titre), taper * pour attribuer à un champ la même valeur que\n"
"celle du champ correspondant du dernier ouvrage enregistré (affiché en bas de la fenêtre)\n\n"
"Utiliser un classement par pièce, meuble et rayonnage par exemple, ou autre codification\n"
"à votre convenance en fonction du mode de stockage des livres. Conserver cependant\n"
"à gauche le plus grand élément et à droite le plus petit afin de faciliter les recherches.")
labinf2.pack(pady=20)
bouf3=Button(feninf, text="Fermer", command=feninf.destroy,bg="orange", fg='brown')
bouf3.pack(side=BOTTOM,pady=10)
restau_curseur()
feninf.grab_set()
def curseur_main(e) :
global fenbul
fen1.config(cursor='hand2')
fenbul=Toplevel()
fenbul.config(bg='yellow')
geo1=fen1.winfo_geometry()
geox=fen1.winfo_rootx()
geoy=fen1.winfo_rooty()
fenbul.geometry("90x19+"+str(geox+465)+"+"+str(geoy+320))
fenbul.resizable(width=False, height=False)
fenbul.overrideredirect(1)
labbul=Label(fenbul,bg='yellow', fg='black',width=15,font=('Arial', 8),text="A propos + Aide",relief=RIDGE)
labbul.pack()
def curseur_fleche(e) :
restau_curseur()
def restau_curseur() :
global fenbul
fen1.config(cursor='arrow')
fenbul.destroy()
def quitter_prog() :
global fenqui
fenqui=Toplevel()
fenqui.config(bg='yellow',bd=3,relief='groove')
geo1=fen1.winfo_geometry()
geox=fen1.winfo_rootx()
geoy=fen1.winfo_rooty()
fenqui.geometry("150x60+"+str(geox+220)+"+"+str(geoy+160))
fenqui.resizable(width=False, height=False)
fenqui.overrideredirect(1)
labqui=Label(fenqui,bg='yellow',fg='red',font=('Arial', 12),text="Quitter Biblio ?")
labqui.place(x=17,y=1)
repon=StringVar()
bououi=Button(fenqui,text="Oui", bg='pink', fg='black',command=confir_quitter)
bounon=Button(fenqui,text="Non", bg='pink', fg='black',command=continu_prog)
bououi.place(x=20,y=25)
bounon.place(x=90,y=25)
fenqui.grab_set()
def confir_quitter() :
fen1.destroy()
def continu_prog() :
global fenqui
fenqui.destroy()
# main
cx = sqlite3.connect("biblio.db3")
cur = cx.cursor()
init()
fen1 = Tk(className='biblio')
fen1.resizable(width=False, height=False)
fen1.geometry("530x375+400+300")
fram1=Frame(fen1,bg='grey',bd=5,relief='ridge')
tit0=Label(fen1, text='Biblio',fg='black',bg='lightyellow',font=('Arial', 20))
tit0.place(x=10,y=10)
tit01=Label(fram1, text=' \n ',bg='grey',fg='black', font=('Arial', 9),width=60)
tit01.place(x=80,y=30)
tit1=Label(fram1, text='Titre : ',bg='grey').place(x=20,y=70)
tit2=Label(fram1, text='Auteur : ',bg='grey').place(x=20,y=100)
tit3=Label(fram1, text='Editeur : ',bg='grey').place(x=20,y=130)
tit4=Label(fram1, text='Type : ',bg='grey').place(x=20,y=160)
tit5=Label(fram1, text='Genre : ',bg='grey').place(x=20,y=190)
tit6=Label(fram1, text='Classement : ',bg='grey').place(x=20,y=220)
tit7=Label(fram1, text='Notes: ',bg='grey').place(x=20,y=250)
mess1=Label(fram1,text='',bg='grey', fg='red', font=('Arial',10))
mess1.place(x=20,y=340)
mess2=Label(fram1,text='',bg='grey', fg='red', font=('Arial',10))
mess2.place(x=20,y=320)
etitre = Entry(fram1,state=DISABLED,width=50)
etitre.place(x=100,y=70)
eauth= Entry(fram1,state=DISABLED,width=30)
eauth.place(x=100,y=100)
eedit = Entry(fram1,state=DISABLED,width=30)
eedit.place(x=100,y=130)
etyp = Entry(fram1,state=DISABLED,width=15)
etyp.place(x=100,y=160)
egenre = Entry(fram1,state=DISABLED,width=15)
egenre.place(x=100,y=190)
eclast = Entry(fram1,state=DISABLED,width=6)
eclast.place(x=100,y=220)
enote = Entry(fram1,state=DISABLED,width=50)
enote.place(x=100,y=250)
can1 = Canvas(fram1, width=20, height=20)
signat=PhotoImage(file='YLC.gif')
sign=can1.create_image(12,12, image=signat,tag="ylc")
can1.tag_bind("ylc","<ButtonRelease>",infos)
can1.tag_bind("ylc","<Enter>",curseur_main)
can1.tag_bind("ylc","<Leave>",curseur_fleche)
can1.place(x=493,y=335)
bok=Button(fram1, text='', command=recherche,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
bok.place(x=400,y=120)
bsupp=Button(fram1, text='', command=supprimer,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
bsupp.place(x=400,y=150)
bmodif=Button(fram1, text='', command=update,bg='grey', fg='blue',state=DISABLED,relief=FLAT)
bmodif.place(x=400,y=180)
benre=Button(fram1, text='', command=enregistrer,bg='grey', fg='darkgreen',state=DISABLED,relief=FLAT)
benre.place(x=400,y=210)
blist=Button(fram1, text='Liste complète', command=lister, bg='lightblue', fg='blue')
blist.place(x=70,y=290)
beffa=Button(fram1, text=' Nouvelle saisie', command=nouveau, bg="lightblue", fg='blue')
beffa.place(x=190,y=290)
bcher=Button(fram1, text='Chercher', command=chercher,bg="lightblue", fg='blue')
bcher.place(x=320,y=290)
bferm=Button(fram1, text='Quitter', command=quitter_prog, bg="pink", fg='black')
bferm.place(x=420,y=290)
fram1.pack(fill=BOTH, expand=1)
fen1.mainloop()
#===========================================================
#===========================================================
#===========================================================
#===========================================================
#sous-prog d'impression de biblio
import wx
import wx.lib.printout as printout
import sqlite3
class Frame(wx.Frame):
def __init__(self, parent, title) :
wx.Frame.__init__(self, parent, -1, title,size=((250, 120)))
panel = wx.Panel(self)
box1 = wx.StaticBox(panel, -1, u"")
bsizer1 = wx.StaticBoxSizer(box1, wx.HORIZONTAL)
bferm = wx.Button(panel, -1, u"Fermer")
bsizer1.Add(bferm, 10,wx.RIGHT|wx.ALL, 10)
self.liste = wx.ListCtrl(panel,-1,size=(1000,300),style=wx.LC_REPORT)
self.Bind(wx.EVT_BUTTON, self.Fermer, bferm)
sizer = wx.BoxSizer(wx.VERTICAL)
boit = wx.BoxSizer(wx.HORIZONTAL)
boit.Add(bsizer1, 0, wx.ALL, 10)
sizer.Add(boit, 0, wx.ALL|wx.CENTER, 10)
sizer.Add(self.liste, 1, wx.ALL|wx.CENTER, 0)
panel.SetSizer(sizer)
panel.Layout()
self.Centre()
self.Imprimer(self)
def RecupDonnees(self,requete) :
try:
cur.execute(requete)
lignes = cur.fetchall()
return lignes
except :
print "erreur RecupDonnees: "
finally :
cur.close()
cx.close()
def Prepareimpri(self):
lignes = self.RecupDonnees(requete)
prt = printout.PrintTable(self)
prt.SetLandscape()
prt.SetHeader("BIBLIO - "+titre)
prt.label = [u"Titre", u"Auteur", u"Editeur", u"Type", u"Genre", u"Classt",u"Notes"]
prt.text_font_size = 7
prt.set_column =[2.5,1.7,1.3,0.9,0.8,0.6,3.0]
prt.cell_left_margin = 1.0/32.0
prt.left_margin=0.2
prt.data = lignes
prt.SetFooter(u"Page ", type =u"Num")
return prt
def Imprimer(self, evt):
global seq, typdem
if seq==0 :
seq=1
prt = self.Prepareimpri()
if typdem=="V" :
prt.Preview()
else :
prt.Print()
self.Destroy()
def Fermer(self, evt):
self.Destroy()
class MyApp(wx.App):
def OnInit(self):
frame = Frame(None, u"Impression-Visualisation Biblio")
self.SetTopWindow(frame)
frame.Show(True)
return True
#main
seq =0
cx = sqlite3.connect("biblio.db3")
cx.isolation_level = None
cur = cx.cursor()
req1=u"select tit,req,dem from param where num=1"
cur.execute(req1)
row=cur.fetchone()
titre=row[0]
requete=row[1]
typdem=row[2]
app = MyApp(True)
app.MainLoop()
Conclusion
Programmes écrits en Python avec Tkinter et SQLlite.
Je sais que ce n'est pas forcément très judicieux d'appeler un sous programme pour faire l'impression, mais je n'ai pas trouvé d'autre moyen d'autant que j'avais l'intention de faire du module d'impression un module généralisé utilisé par d'autres applications.
Historique
- 21 novembre 2008 16:46:21 :
- J'avais oublié de joindre l'image YLC.gif à mon Zip.
Voilà qui est corrigé !
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
python+bibliotheque [ par samuray07 ]
salam; à l'aide s'il vous plait:on me demande une application faisant la "gestion d'une bibliotheque" developpée en <font color="#ff00
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|