Biblio : gestionnaire de bibliothèque

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 / 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.

Codes Sources

A voir également

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.