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 / Exemple :
# 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.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.