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 :

passage de variables et Tkinter


Sujet :

Python

  1. #21
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Et comme je pense que tu vas faire le chemin inverse...

    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
    #-*- conding:utf-8 -*-
    import sqlite3
    from Tkinter import *
     
    class Globals_Papeterie():
        Index = 1
     
    fen =Tk()
     
    #---------------------------------------------------------------
    conn = sqlite3.connect("mydb.sqlite")
    cursor = conn.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS "papeterie"(id integer PRIMARY KEY AUTOINCREMENT,lib VARCHAR(255), "mont" DECIMAL(10, 2))""")
    #---------------------------------------------------------------
     
    def voir_une_ligne():
        r = cursor.execute("SELECT * FROM papeterie").fetchone()
        index_var.set('index : ' + str(r[0])) # + car avec , cela fais deux arguments. Donc str() pour concatener.
        lib_var.set('lib : ' + str(r[1]))
        mont_var.set('mont : ' + str(r[2]))
    
    def voir_ligne_choisie():
        num = 5
        for line in cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(str(num),)):
            index_var.set('index : ' + str(line[0]))
            lib_var.set('lib : ' + str(line[1]))
            mont_var.set('mont : ' + str(line[2]))
    
    def liste():
        for line in cursor.execute("SELECT * FROM papeterie"): print line
        print 'Total : ', cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]
    
    def voir_suivant_valeur(Index):
        if Index and 0 < int(Index) < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0] + 1:
            r = cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(Index,)).fetchall()[0]
            index_var.set('index : ' + str(r[0]))
            lib_var.set('lib : ' + str(r[1]))
            mont_var.set('mont : ' + str(r[2]))
            Globals_Papeterie.Index = int(Index)
    
    def voir_ligne_par_ligne():
        if 0 < Globals_Papeterie.Index < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]:
            Globals_Papeterie.Index += 1
            r = cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(str(Globals_Papeterie.Index),)).fetchall()[0]
            index_var.set('index : ' + str(r[0]))
            lib_var.set('lib : ' + str(r[1]))
            mont_var.set('mont : ' + str(r[2]))
    
    #---------------------------------------------------------------
    Rech_Ind = Entry(fen)
    Rech_Ind.grid(row=1, column=1)
    
    bout0 = Button(fen,text="voir la ligne courante", command =voir_une_ligne)
    bout0.grid(row=3, column=1)
     
    bout1 = Button(fen,text="entrez le num de ligne", command =voir_ligne_choisie)
    bout1.grid(row=4, column=1)
     
    bout2 = Button(fen,text="lister le fichier", command=liste)
    bout2.grid( row=5, column=1)
     
    bout3 = Button(fen,text="voir suivant une entry", command = lambda: voir_suivant_valeur(Rech_Ind.get()))
    bout3.grid(row=6, column=1)
     
    bout4 = Button(fen,text="voir l'enregistrement suivant", command =voir_ligne_par_ligne)
    bout4.grid(row=7, column=1)
    
    index_var = StringVar()
    index_var.set('index : ')
    lab1 = Label(fen, textvariable=index_var, bg="white", width=20)
    lab1.grid(row=0, column=2)
    
    lib_var = StringVar()
    lib_var.set('lib : ')
    lab2 = Label(fen, textvariable=lib_var, bg="white", width=20)
    lab2.grid(row=1, column=2)
    
    mont_var = StringVar()
    mont_var.set('mont : ')
    lab3 = Label(fen, textvariable=mont_var, bg="white", width=20)
    lab3.grid(row=2, column=2)
    
    boutquit = Button(fen, text='quitter', command=fen.quit)
    boutquit.grid( row=3, column=2)
    #---------------------------------------------------------------
     
    fen.mainloop()
    conn.commit()
    conn.close()

  2. #22
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Par défaut
    Mille merci PauseKawa
    Tu as bien prédigéré mon travail. Il ne reste plus qu'à m'y mettre aussi pour comprendre tout ça. Je me base sur ton dernier post qui me parait le moins barbare ... Par contre je ne souhaite pas m'attaquer à la notion de langage orienté objet (classe...) en tous cas pour l'instant (mes neurones ne suivraient pas...)
    a+

  3. #23
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Libre à toi de faire un code de ne pas utiliser de classe ni self. Par contre tu te retrouve dans la problématique que tes variables traitées en local dans les fonctions ne sont pas les mêmes que celles du principal.

    J'ai une solution pour toi. C'est lourd par rapport à l'utilisation de self et autre mais cela fonctionne :

    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
    def voir_suivant_valeur():
        LocalIndex = Index.get() # Index existe pour voir_suivant_valeur. Nous attribuons sa valeur a LocalIndex pour une utilisation locale.
        if LocalIndex >= cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]:
            LocalIndex = cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]
        elif LocalIndex < 1: LocalIndex = 1
        r = cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(str(LocalIndex),)).fetchall()[0]
        index_var.set('index : ' + str(r[0]))
        lib_var.set('lib : ' + str(r[1]))
        mont_var.set('mont : ' + str(r[2]))
     
    def voir_ligne_par_ligne():
        LocalIndex = Index.get() # Index existe pour voir_ligne_par_ligne. Nous attribuons sa valeur a LocalIndex pour une utilisation locale.
        if 0 < LocalIndex < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]:
            LocalIndex += 1
        elif LocalIndex >= cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]:
            LocalIndex = cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]
        elif LocalIndex < 1: LocalIndex = 1
        r = cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(str(LocalIndex),)).fetchall()[0]
        index_var.set('index : ' + str(r[0]))
        lib_var.set('lib : ' + str(r[1]))
        mont_var.set('mont : ' + str(r[2]))
        Index.set(LocalIndex) # Redonne la valeur de LocalIndex a Index
     
    #---------------------------------------------------------------
    Index = IntVar() # Initialisation de Index
    Index.set(1) # La valeur Index passe a 1
    Rech_Ind = Entry(fen, textvariable=Index) # la variable textvariable est Index
    Rech_Ind.grid(row=1, column=1)
     
    bout3 = Button(fen,text="voir suivant une entry", command = voir_suivant_valeur)
    bout3.grid(row=6, column=1)
     
    bout4 = Button(fen,text="voir l'enregistrement suivant", command = voir_ligne_par_ligne)
    bout4.grid(row=7, column=1)
    @+

    Edit:

    Il est aussi possible d'utiliser Index tels quel bien sur (bien que je préfère utiliser des locales):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def voir_suivant_valeur():
        NB_Val = cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0] # Pour ne faire qu'une fois la requete.
        if Index.get() > NB_Val: Index.set(NB_Val)
        elif Index.get() < 1: Index.set(1)
        r = cursor.execute("SELECT * FROM papeterie WHERE id = (?)",(str(Index.get()),)).fetchall()[0]
        index_var.set('index : ' + str(r[0]))
        lib_var.set('lib : ' + str(r[1]))
        mont_var.set('mont : ' + str(r[2]))

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Par défaut
    Bonsoir PauseKawa
    Le code avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class Globals_Papeterie():
        Index = 1 # Et pas 0
    Me parait bien plus propre et trop concis pour le délaisser, je continue donc sur cette base mais la fonction ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def voir_suivant():
    	if Globals_Papeterie.Index < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0] + 1:
    		Globals_Papeterie.Index += 1
    		print(cursor.execute("select * from papeterie where id = (?)",(str(Globals_Papeterie.Index))).fetchall()[0])
    renvoie ceci dès que "Globals_Papeterie.Index" atteint une somme à 2 chiffres :
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
    File "class.py", line 39, in voir_suivant
    print(cursor.execute("select * from papeterie where id = (?)",(str(Globals_Papeterie.Index))).fetchall()[0]) # Globals_Papeterie.Index en string bien sur
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.

    Comment faire ?
    Merci d'avance

  5. #25
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir trombo,

    Regarde mon 'oups' et les virgules en rouge.

    @+

    Edit : str(Globals_Papeterie.Index)...

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Bonsoir trombo,
    Regarde mon 'oups' et les virgules en rouge.
    Vraiment trop délicates ces petites virgules....
    Finalement ça donne ceci qui me parait sympa :
    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
     
    #-*- conding:utf-8 -*-
    import sqlite3
    from tkinter import *
     
    class Globals_Papeterie():
        Index = 0 # Et pas 0
     
    fen =Tk()
     
    #---------------------------------------------------------------
    conn = sqlite3.connect("mydb.sqlite")
    cursor = conn.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS "papeterie"(id integer PRIMARY KEY AUTOINCREMENT,lib VARCHAR(255), "mont" DECIMAL(10, 2))""")
    #---------------------------------------------------------------
     
    def voir_premiere_ligne():
        print(cursor.execute("select * from papeterie").fetchone()) # Te donne toujours l'enregistrement 1
     
    def voir_ligne_choisie():
        num = 10
        for line in cursor.execute("select * from papeterie where id = (?)",(str(num),)): # str(num) car num est de type int
            print(line)
     
    def liste():
        for line in cursor.execute("SELECT * FROM papeterie"): print(line)
        print('Total : ', cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0])
     
    # Sinon puisque tu galere avec les variables regarde ce que donne une classe Globals_Papeterie
     
    def voir_suivant_entry(Index):
    	if Index and 0 < int(Index) < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0] + 1:
    		print('Index  =  ',Index)
    		print(cursor.execute("select * from papeterie where id = (?)",(Index,)).fetchall()[0])# Ici Index est deja un string				
    		Globals_Papeterie.Index = int(Index) # Donne a Globals_Papeterie.Index la valeur de Index (le Rech_Ind.get() donc)
     
    def voir_precedant():
    	if Globals_Papeterie.Index > 1 and 0 < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0] + 1:
    		Globals_Papeterie.Index -= 1 # Incremente de 1. A toi de gerer la fin ;).
    		print(cursor.execute("select * from papeterie where id = (?)",(str(Globals_Papeterie.Index),)).fetchall()[0]) # Globals_Papeterie.Index en string bien sur
     
    def voir_suivant():
    	if Globals_Papeterie.Index < cursor.execute("SELECT COUNT(*) FROM papeterie").fetchall()[0][0]:
    #		if not Globals_Papeterie.Index < 2:
    		Globals_Papeterie.Index += 1 # Incremente de 1. A toi de gerer la fin ;).
    		print(cursor.execute("select * from papeterie where id = (?)",(str(Globals_Papeterie.Index),)).fetchall()[0]) # Globals_Papeterie.Index en string bien sur
     
    #---------------------------------------------------------------
    Rech_Ind = Entry(fen)
    Rech_Ind.grid( row=1, column=2)
     
    bout0 = Button(fen,text="voir la premiere ligne", command =voir_premiere_ligne)
    bout0.grid(row=3, column = 2)
     
    bout1 = Button(fen,text="Voir la ligne num 10 ", command =voir_ligne_choisie)
    bout1.grid(row=4, column = 2)
     
    bout2 = Button(fen,text="lister le fichier", command=liste)
    bout2.grid( row=5, column=2)
     
    bout4 = Button(fen,text="voir suivant une entry", command = lambda: voir_suivant_entry(Rech_Ind.get())) # http://python.developpez.com/faq/?page=Button
    bout4.grid(row=7, column = 2)
     
    bout_precede = Button(fen,text="voir l'enregistrement precedant", command =voir_precedant)
    bout_precede.grid(row=8, column = 2)
     
    bout5 = Button(fen,text="voir l'enregistrement suivant", command =voir_suivant)
    bout5.grid(row=9, column = 2)
     
    bout_quit = Button(fen, text='quitter', command=fen.quit)
    bout_quit.grid( row=10, column=2)
     
    #---------------------------------------------------------------
     
    fen.mainloop()
    conn.commit()
    conn.close()
    Mais je n'ai pas beaucoup de mérite, et je me demande d'ailleurs ou j'aurais pu trouver qu'il fallait insérer une virgule rouge après un La documentation sur Tkinter me parait d'ailleurs assez confidentielle ???
    a+

  7. #27
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour trombo,

    Désolé pour la réponse rapide.
    En fait ce n'est pas Tkinter mais le .execute de sqlite3 (sqlite3.ProgrammingError:)qui demande une séquence alors que tu lui envoie un string. Donc tout va bien sauf arrivé à la fin.

    Aprés c'est des requetes.

    Pour ce qui est de Tkinter la doc et les exemples du net sont bien suffisants pour créer une interface.
    Pour les fonctions plus approfondies il existe des personnes compétentes sur le forum.

    @+

Discussions similaires

  1. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25
  2. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  3. [Kylix] passage de variable en Libc
    Par zheng dans le forum EDI
    Réponses: 11
    Dernier message: 06/05/2004, 14h14
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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