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

Tkinter Python Discussion :

sqlite3 enregistrement a la fermeture [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en gestion de la relation client (GRC)
    Inscrit en
    Mars 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant en gestion de la relation client (GRC)

    Informations forums :
    Inscription : Mars 2024
    Messages : 5
    Par défaut sqlite3 enregistrement a la fermeture
    Bonjour,

    J'ai quelque chose de bizarre dans mon script. Il fonctionne très bien mais l'enregistrement dans la bdd ne se fait que lorsque la fenetre tkinter est fermée.
    Auriez-vous une solution pour que l'enregistrement ou la mise à jour se fasse sans devoir fermer la fenetre

    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
    import sqlite3
    import creation
    import cartouche
    import ajout_supp
    import tkinter
    from pathlib import Path
    import os
     
    cart = cartouche.Cartouches()
     
    def valider_scan(entry_code_barre):
        # recuperation du code barre
        code_barre = entry_code_barre.get()
     
        # vidage de l'entry
        entry_code_barre.delete(0, 'end')
     
        # connexion bdd
        chemin_bdd = Path(str(Path(os.getcwd()).parent)+r"\cartouche.db")
        connection = sqlite3.connect(chemin_bdd)
        curseur = connection.cursor()
     
        # test si le code barre existe
        nb_ligne = curseur.execute("""SELECT COUNT(*) FROM cartouches WHERE code_barre=?""", (code_barre, )).fetchone()[0]
     
        if nb_ligne == 0:
            # s'il n existe pas on ajoute
            creation.creation_cartouche(cart)
     
            curseur.execute("""INSERT INTO cartouches(nom, type, quantite, code_barre) VALUES(?, ?, ?, ?)""", (cart.nom, cart.type, 1, code_barre))
            connection.commit()
        else:
            # si le code barre existe on demande si on ajoute ou en supprime
            ajout_supp.ajout_supp_cartouche(cart)
     
            # recupere le nombre de cartouche
            nb_cartouche = curseur.execute("""SELECT quantite FROM cartouches WHERE code_barre=?""", (code_barre,)).fetchone()[0]   
     
            if cart.ajout == "ajout":
                # on ajoute une cartouche
                nb_cartouche += 1
     
                # on met a jour la valeur dans la bdd
                curseur.execute("""UPDATE cartouches SET quantite=? WHERE code_barre=?""", (nb_cartouche, code_barre))
                connection.commit()
     
            if cart.ajout == "supp":
                # on supprime une cartouche
                nb_cartouche -= 1
     
                # on met a jour la valeur dans la bdd
                curseur.execute("""UPDATE cartouches SET quantite=? WHERE code_barre=?""", (nb_cartouche, code_barre))
                connection.commit()
     
        # fermeture de la bdd
        connection.close()
     
    """
    fenetre principale
    """
    if __name__ == '__main__':
        win_scan = tkinter.Tk()
        win_scan.title("scan des codes barres des cartouches")
        win_scan.geometry("400x100")
     
        label_scan = tkinter.Label(win_scan, text="en attente de scan ...")
        entry_scan = tkinter.Entry(win_scan)
     
        label_scan.pack(padx=10, pady=10)
        entry_scan.pack(padx=10, pady=10)
     
        # permet d'entrer dans le entry
        entry_scan.focus_set()
     
        entry_scan.bind('<Return>',lambda e: valider_scan(entry_scan))
     
        win_scan.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Salut,

    Normalement commit suffit. Comment arrivez vous à constater ce que vous racontez ?

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant en gestion de la relation client (GRC)
    Inscrit en
    Mars 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant en gestion de la relation client (GRC)

    Informations forums :
    Inscription : Mars 2024
    Messages : 5
    Par défaut
    Je suis bien d'accord, c'est pour ça que je trouve cela bizarre.

    Je le constate de 2 facons :
    - j'ai une autre fenetre qui m'affiche ce qui est enregistré dans la bdd
    - avec DB Browser for SQLite

    dans les 2 cas rien n'apparait tant que la fenetre reste ouverte et des la fermeture ca apparait

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par olivbarb154892 Voir le message
    dans les 2 cas rien n'apparait tant que la fenetre reste ouverte et des la fermeture ca apparait
    SQLite n'accepte pas ce genre de concurrence: ça attend jusqu'à l'expiration d'un timeout l'accès exclusif au fichier de la base.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant en gestion de la relation client (GRC)
    Inscrit en
    Mars 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Consultant en gestion de la relation client (GRC)

    Informations forums :
    Inscription : Mars 2024
    Messages : 5
    Par défaut
    ok pour l'affichage mais dans ce cas pourquoi nb_ligne (ligne 24) reste à 0 et le script me relance creation_cartouche alors que DB Browser for SQLite et ma fenetre d'affichage (affichage.py) sont fermés (je viens de tester) ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par olivbarb154892 Voir le message
    ok pour l'affichage mais dans ce cas pourquoi nb_ligne (ligne 24) reste à 0
    Voilà un autre sujet qui sans code complet pour le reproduire...
    Tout ce que je peux dire c'est que ces quelques lignes fonctionnent très bien:
    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
    >>> import sqlite3
    >>> con = sqlite3.connect("tutorial.db")
    >>> cur = con.cursor()
    >>> cur.execute("CREATE TABLE movie(title, year, score)")
    <sqlite3.Cursor object at 0x000001B7FDA43740>
    >>> cur.execute("""
    ...     INSERT INTO movie VALUES
    ...         ('Monty Python and the Holy Grail', 1975, 8.2),
    ...         ('And Now for Something Completely Different', 1971, 7.5)
    ... """)
    <sqlite3.Cursor object at 0x000001B7FDA43740>
    >>> con.commit()
    >>> qry = "SELECT COUNT(*) FROM movie WHERE year=?"
    >>> cur.execute(qry, (1975,))
    <sqlite3.Cursor object at 0x000001B7FDA43740>
    >>> _.fetchone()
    (1,)
    >>>

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enregistrement a la fermeture
    Par DavidGagnaire dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/06/2011, 16h15
  2. Réponses: 11
    Dernier message: 06/04/2011, 15h12
  3. [XL-2003] enregistrer a la fermeture
    Par olivier-tig dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/09/2009, 16h23
  4. Réponses: 3
    Dernier message: 13/01/2009, 12h03
  5. Réponses: 6
    Dernier message: 07/08/2007, 17h01

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