IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

sqlite3 is locked


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut sqlite3 is locked
    bonjour
    me revoila, avec une nouveau problème:
    une petit formulaire tkinter, qui enregistre les donnée dans une base sqlite3, les 5 premiers essais sont concluant puis au sixième :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       cursor.execute('INSERT INTO clients VALUES (?,?,?,?,?,?,?,?)', new_client)
    sqlite3.OperationalError: database is locked
    le code de connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     if nomrecu:
            connection = sqlite3.connect("base1.db")
            cursor = connection.cursor()  
            new_client = (cursor.lastrowid, nomrecu, prenomrecu, tel1recu, tel2recu, villerecu, codepostalrecu, pubrecu)
            cursor.execute('INSERT INTO clients VALUES (?,?,?,?,?,?,?,?)', new_client)
            connection.commit()
            connection.close()
     
        else:
     
            show_error()
    merci de votre attention

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    merci de votre attention
    Mais toi as-tu fais attention à notre précédente discussion où je t'avais annoncé que ce n'était pas correct d'ouvrir de multiples connections ?

    Réponse : Non

    Donc je t'invite à la relire...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par fred1599 Voir le message
    Mais toi as-tu fais attention à notre précédente discussion où je t'avais annoncé que ce n'était pas correct d'ouvrir de multiples connections ?
    D'après le code, il ne semble pas y avoir de multiples connections mais plutôt des connections sérialisées non ? Chaque insertion amenant une ouverture puis une fermeture. Ce n'est certainement pas optimisé ni efficient mais ça ne devrait pas planter...

    Ceci dit, dans cette même discussion tu t'étais interrogé sur comment sérialiser les accès multiples (cela m'avait amené moi aussi à me poser la question).
    Et là on peut en déduire la réponse: tester sqlite3.OperationalError et recommencer tant que ça foire (un peu à l'image d'un sémaphore)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Sve@r,

    Je n'ai rien vu sur une quelconque sérialisation dans un pool de connexion avec SQLite, d'où ma question, je reste perplexe sur cette possibilité, j'attends toujours une réponse... Pas sûr de l'avoir un jour !

    Je sais ce qui fonctionne,
    1. Créer sa connexion à la base de données (une seule fois)
    2. Créer sa table clients si elle n'existe pas
    3. Insérer ses éléments si nomrecu
    4. Sauvegarder les changements
    5. Fermer la connexion à la base de données


    Pour ce qui est des multiples connexions, dans ce cas de figure, il n'y a aucun intérêt à mon sens et si c'était le cas, je pense qu'il faudrait changer de SGBD.

    des connections sérialisées
    Il faut m'expliquer ce qu'on appelle des connexions sérialisées...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il faut m'expliquer ce qu'on appelle des connexions sérialisées...
    J'essayais de montrer par ce terme la notion de connexions qui se suivent sans se heurter, la connexion "n+1" ne se faisant que quand la connexion "n" a été fermée, à l'image des circuits électriques avec piles (ou ampoules) en série.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Le message d'erreur "database is locked" reflète juste que sqlite3 supporte les accès concurrents dans certaines limites (ici le timeout pendant lequel on attend que la base se libère).

    Le plus simple serait d'utiliser un SGDB plus robuste... car si vous voulez continuer avec sqlite, c'est possible mais il va falloir ouvrir la documentation, lire les contournements adoptés par ceux qui ont eu le même genre de pépins, et arbitrer la solution à retenir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    J'essayais de montrer par ce terme la notion de connexions qui se suivent sans se heurter, la connexion "n+1" ne se faisant que quand la connexion "n" a été fermée, à l'image des circuits électriques avec piles (ou ampoules) en série.
    Ce que j'appelle une transaction, en tout cas c'est ce qui se rapproche le plus à mon sens de ce que tu donnes comme définition.

    Le message d'erreur "database is locked" reflète juste que sqlite3 supporte les accès concurrents dans certaines limites (ici le timeout pendant lequel on attend que la base se libère).
    C'est ce que j'avais lu dans la documentation aussi, cependant le timeout par défaut est de 5 secondes, ce qui est déjà long, et me fait penser à un autre problème.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    C'est ce que j'avais lu dans la documentation aussi, cependant le timeout par défaut est de 5 secondes, ce qui est déjà long, et me fait penser à un autre problème.
    C'est au PO de penser à ce qu'il veut réaliser et si les outils qu'il emploie sont adéquats (c'est lui le programmeur).
    S'il veut qu'on pense à sa place, il faudrait fournir de quoi reproduire ou mieux décrire son problème (si ça par en timeout, c'est que la requête précédente prend du temps: elle fait quoi?).
    Encore faut-il avoir le temps de faire un boulot de conception et proposer une solution adaptée à son niveau (sinon il ne pourra peut être pas en faire quelque chose).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Ce que j'appelle une transaction
    Non la transaction ce n'est pas ça
    En bdd une transaction c'est une suite d'opérations individuelles (insert puis delete puis update puis...) qui doivent se comporter comme une opération unique et atomique. Si une seule opération échoue on annule tout.
    On a l'habitude, pour représenter une transaction, de donner l'exemple d'un virement bancaire (Pierre vire 1000€ à Paul). En bdd cette opération se traduira par un premier update pour réduire le solde de Pierre puis un second update pour monter celui de Paul (ou dans l'autre sens peu importe). Si la transaction s'arrête après le premier update, sans atomicité alors soit Pierre a perdu 1000€ qui se sont évanouis dans le subespace ; soit Paul a gagné 1000€ sans qu'ils aient été débités (cela dépend du sens des update). Avec l'atomicité de la transaction (critère "A" de "ACID"), si celle-ci s'interrompt au milieu tout est annulé et la bdd est de nouveau intègre. Le virement n'a pas été fait mais la bdd reste cohérente (critère "C" de ACID).

    Sous Postgres (désolé je le connais mieux que sqlite) on crée une transaction via l'ordre start transaction puis on place tous les insert/update/delete nécessaires puis soit on valide le tout via un commit soit on annule tout via un rollback. Et si le serveur plante entre temps, comme la transaction s'est effectuée dans une espèce de bac à sable, tout est annulé automatiquement au redémarrage du serveur.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    La vache !! vous m avais perdu là !!

    je reviendrais sur ce post :


    Citation Envoyé par fred1599 Voir le message
    Mais toi as-tu fais attention à notre précédente discussion où je t'avais annoncé que ce n'était pas correct d'ouvrir de multiples connections ?
    mais je ne comprends pas où il y a des connexions multiple, puisque une fois les champs remplis, j envois =>> la connexion " s ouvre" insert blabla et la connexion se ferme (connection.close() )
    Ca à d ailleurs fonctionné avec les 5 premières requêtes !!
    et avec du temps entre chaque essai !

    EDIT :
    j ai trouvé ! (vous allez pester ! )
    je me sert de DBbrowser pour gérer les bases, et le logiciel était ouvert en arrière plan, mais ça n a pas gêné les premières connexions....bref
    une fois fermé ça fonctionne !
    dsl pour le dérangement !

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    mais je ne comprends pas où il y a des connexions multiple, puisque une fois les champs remplis, j envois =>> la connexion " s ouvre" insert blabla et la connexion se ferme (connection.close() )
    Lorsque tu lis un livre, est-ce que tu le fermes entre chaque page ?
    En bdd c'est pareil. Si on doit travailler dans une bdd on l'ouvre au début du travail et on la referme à la fin. Et durant le travail on fait tout ce qu'il y a à faire. C'est simple à programmer et c'est efficace.

    Citation Envoyé par bilcosby Voir le message
    Ca à d ailleurs fonctionné avec les 5 premières requêtes !!
    wiztricks parle d'une tempo. Hypothèse: les fermetures ne sont pas immédiates mais temporisées et donc lorsque vient la 6° requête, la première fermeture ne s'est pas encore faite. Mais encore une fois que cette hypothèse soit vérifiée ou pas peu importe, tu aurais travaillé comme les nombreux utilisateurs de bdd le préconisent depuis 50 ans (la vache, déjà 1/2 siècle d'informatique !!!) tu n'aurais pas ce souci.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Lorsque tu lis un livre, est-ce que tu le fermes entre chaque page ?
    En bdd c'est pareil. Si on doit travailler dans une bdd on l'ouvre au début du travail et on la referme à la fin. Et durant le travail on fait tout ce qu'il y a à faire. C'est simple à programmer et c'est efficace.
    je dois déplacer connection.close alors ?

    pour info j ai réouvert DB browser et ça fonctionne quand même ! j y comprends rien !

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    EDIT :
    j ai trouvé ! (vous allez pester ! )
    je me sert de DBbrowser pour gérer les bases, et le logiciel était ouvert en arrière plan, mais ça n a pas gêné les premières connexions....bref
    C'est juste ce que dit le message d'erreur.

    Normalement, si le code que vous montrez est dans une fonction de rappel appelée par un évènement tkinter (l'utilisateur clique sur le bouton valider...), elle ne sera jamais appelée 2 fois simultanément (c'est tkinter qui le garanti).

    Ceci dit ce n'est pas parce que vous utilisez tkinter que vous l'utilisez correctement (pour avoir cette garantie) et sans montrer de code qui permette de reproduire le soucis rencontré... on ne peut que spéculer.

    Le problème dans tout ça est dans la fiabilité du code que vous fabriquez. Comment allez vous assurer que ça fait bien le job? Comment faire pour qu'en cas de soucis on ait un message d'erreur exploitable?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Sve@r,

    Je sais ce qu'est une transaction,

    Mais dans ce contexte, ouvrir une connexion, insérer des données et fermer une connexion représente une transaction.

    Donc à chaque reconnexion, une transaction...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    bon soit,
    j ai pas compris cette histoire de multiple connexion..
    Mais bref je verrais le moment venu si ça se complique ...
    merci à tous et à bientôt !

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    j ai pas compris cette histoire de multiple connexion..
    sqlite n'accepte pas plusieurs accès à la même bdd en même temps. C'est une exception car une très grande majorité de serveurs bdd l'accèptent (et savent gérer) mais pas lui (il n'a pas été créé dans cette optique).
    Et ce n'est pas parce que "parfois ça marche" (comme avec db browser) qu'il faut croire que c'est bon. Si ça marche c'est un hasard (peut-être qu'en lecture uniquement ça peut le faire) mais ce n'est pas une assurance.

    C'est un peu la même chose avec tout. Tu peux par exemple parfaitement ouvrir un fichier texte plusieurs fois en même temps. Est-ce faisable ? Oui. Est-ce correct ? Non.
    Le souci c'est ensuite à l'enregistrement
    • parfois le logiciel a été conçu pour détecter le cas et donc te prévient
    • si t'es sous Windows il détecte alors un verrouillage système sur le fichier et donc t'interdit (si t'es pas sur la première instance) d'écrire le fichier
    • si t'es sous Linux c'est le dernier qui écrit qui gagne
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    j ai bien compris le principe, mais je ne comprends pas où dans mon code il y a des connexions multiple :
    voici comment je procède:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      if nomrecu:
            connection = sqlite3.connect("base1.db")
            cursor = connection.cursor()
            new_client = (cursor.lastrowid, nomrecu, prenomrecu, tel1recu, tel2recu, villerecu, codepostalrecu, pubrecu)
            cursor.execute('INSERT INTO clients VALUES (?,?,?,?,?,?,?,?)', new_client)
            connection.commit()
            connection.close()
        else:
    
            show_error()
    la connexion est bien fermé jusqu' a la prochaine requête !?

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    j ai bien compris le principe, mais je ne comprends pas où dans mon code il y a des connexions multiple :la connexion est bien fermé jusqu' a la prochaine requête !?
    Oui, c'est ce que je disais dans mon premier post "D'après le code, il ne semble pas y avoir de multiples connections". Mais bon, on n'a pas tout le code, on ne sait pas dans quel contexte il est utilisé, il y a une histoire de timeout et DB browser qui vient rajouter son grain de sel là dedans. Et wiztricks l'a bien dt "Ceci dit ce n'est pas parce que vous utilisez tkinter que vous l'utilisez correctement (pour avoir cette garantie) et sans montrer de code qui permette de reproduire le soucis rencontré... on ne peut que spéculer."
    La seule constante sur laquelle on peut s'appuyer c'est ce message "database locked". De là donc on spécule ; tout en rajoutant quelques appréciations dont l'une d'elles c'est que ouvrir+fermer à chaque action c'est pas ce qu'il y a de plus sain.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par bilcosby Voir le message
    j ai bien compris le principe, mais je ne comprends pas où dans mon code il y a des connexions multiple :
    Le message d'erreur ne se trompe pas donc il y a connections multiples.... et le code que vous nous proposez de regarder étant partiel n'aide pas à savoir où et comment.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    bon ben puisque vous insistez ! je colle tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    # coding:utf-8
    import tkinter
    import sqlite3
    from tkinter import *
    from tkinter import messagebox
    import tkinter as tk
    from tkinter import ttk
    main = tk.Tk()
    main.title("Mainapp")
    main.configure(bg='lightgrey')
    main.geometry("500x300+1500+500")
     
     
    def show_error():
        messagebox.showerror("Erreur", "Il y a eu une erreur!")
     
     
    def message_doublon():
        messagebox.showerror("Erreur", "Client déjà enregistré !")
     
    def enregistrement():
        fenetre2 = tkinter.Toplevel(main)
        fenetre2.title('reception BDD')
        fenetre2.geometry("420x200+1550+550")
        fenetre2.attributes('-topmost', True)
     
     
    # ************************** R E P O N S E *****************************
     
        nomrecu = entrynom.get()
        prenomrecu = entryprenom.get()
        tel1recu = entrytel1.get()
        tel2recu = entrytel2.get()
        villerecu = entryville.get()
        codepostalrecu = entrycodepostal.get()
        pubrecu = entrypub.get()
        # label_pub = Label(fenetre2, text='LA PUB EST    :' + pubrecu, fg='black', font=('', 10))
        # label_pub.grid(row=3, column=0, sticky=W)
     
    # ****** ECRITURE BASE DE DONNEE******************************************
     
        if nomrecu:
             connection = sqlite3.connect("D:/Bureau 1/Formation python/BDD/sqlite/base1.db")
            cursor = connection.cursor()
            # Vérification si le client existe déjà
            cursor.execute("SELECT * FROM clients WHERE nom=? AND prenom=?", (nomrecu, prenomrecu))
            existant = cursor.fetchone()
            if existant:
                message_doublon()
                return
            new_client = (cursor.lastrowid, nomrecu, prenomrecu, tel1recu, tel2recu, villerecu, codepostalrecu, pubrecu)
            cursor.execute('INSERT INTO clients VALUES (?,?,?,?,?,?,?,?)', new_client)
            connection.commit()
            connection.close()
     
        else:
     
            show_error()
     
     
    # ************************* Q U E S T I O N S Formulaire******************************
     
     
    labelnom1 = Label(main, text='Nom :', fg='black', bg='lightgray', font=('', 10))
    labelnom1.grid(row=0, column=0, sticky=E, padx=0, pady=10)
     
    var_nom = tkinter.StringVar()
    entrynom = Entry(main, textvariable=var_nom)
    entrynom .grid(row=0, column=1, sticky=W)
     
    labelprenom1 = Label(main, text='Prenom :', fg='black', bg='lightgray', font=('', 10))
    labelprenom1.grid(row=0, column=1, padx=0, pady=10, sticky=E)
     
    var_prenom = tkinter.StringVar()
    entryprenom = Entry(main, textvariable=var_prenom)
    entryprenom .grid(row=0, column=2, sticky=W)
     
    labeltel1 = Label(main, text='Tel_1 :', fg='black', bg='lightgray', font=('', 10))
    labeltel1.grid(row=2, column=0, sticky=E)
     
    var_tel1 = tkinter.StringVar()
    entrytel1 = Entry(main, textvariable=var_tel1, width=10)
    entrytel1 .grid(row=2, column=1, padx=0, pady=10, sticky=W)
     
    labeltel2 = Label(main, text='Tel_2 :', fg='black', bg='lightgray', font=('', 10))
    labeltel2.grid(row=2, column=1, sticky=E)
     
    var_tel2 = tkinter.StringVar()
    entrytel2 = Entry(main, textvariable=var_tel2, width=10)
    entrytel2 .grid(row=2, column=2, padx=0, pady=10, sticky=W)
     
     
    labelville = Label(main, text='ville :', fg='black', bg='lightgray', font=('', 10))
    labelville.grid(row=4, column=0, sticky=E)
     
    var_ville = tkinter.StringVar()
    entryville = Entry(main, textvariable=var_ville)
    entryville .grid(row=4, column=1, padx=0, pady=10, sticky=W)
     
     
    labelcodepostal = Label(main, text='codepostal :', fg='black', bg='lightgray', font=('', 10))
    labelcodepostal.grid(row=4, column=1, sticky=E)
     
    var_codepostal = tkinter.StringVar()
    entrycodepostal = Entry(main, textvariable=var_codepostal, width=6)
    entrycodepostal .grid(row=4, column=2, padx=0, pady=10, sticky=W)
    # ******************************
    labelpub = Label(main, text='pub:', fg='black', bg='lightgray', font=('', 10))
    labelpub.grid(row=5, column=0, sticky=E)
    listepub = ["Pages Jaunes", "Bouche à Oreille", "Internet", "Pub"]
    entrypub = ttk.Combobox(main, values=listepub)
    entrypub .grid(row=5, column=1, padx=0, pady=10, sticky=W)
     
    btn_1 = Button(main, text='Enregistrer', command=enregistrement, height=2, width=30)
    btn_1.grid(row=8, column=1, padx=20, pady=20, sticky=NSEW)
     
     
    # Lancement de la boucle d'événement
     
    main.mainloop()
    bonne lecture !

Discussions similaires

  1. Locking Record
    Par Fr@ncky dans le forum Hibernate
    Réponses: 4
    Dernier message: 24/11/2004, 11h26
  2. Curseur et lock : Les différence & lequel choisir
    Par BilTCD dans le forum Access
    Réponses: 2
    Dernier message: 22/10/2004, 14h03
  3. [CVS] Problème de commit (Could not open lock file)
    Par 1tox dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 19/10/2004, 11h22
  4. [VB.NET] Synchronisation via application.lock
    Par David.V dans le forum ASP.NET
    Réponses: 4
    Dernier message: 15/06/2004, 06h51
  5. Row lock
    Par cassandra dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 09/04/2003, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo