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

GUI Python Discussion :

Connexion d'une nouvelle fenêtre à MYSQL


Sujet :

GUI Python

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Connexion d'une nouvelle fenêtre à MYSQL
    Bonjour, Je réalise un petit programme avec interface graphique faite avec TKinter.
    A partir de la fenêtre principale, un click sur un bouton m'ouvre une nouvelle fenêtre dans laquelle je mets des entry qui sont aleur tour relié à une base de donnée MYQSL. Le problème c'est que lorsque je clique sur le boutton OK J'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [root@localhost test]# python bd.py
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "/usr/lib64/python2.4/lib-tk/Tkinter.py", line 1345, in __call__
    return self.func(*args)
    File "bd.py", line 21, in enr
    id_clas=ed1.get()
    NameError: global name 'ed1' is not defined

    Pourtant j'ai bien vérifié le nom des entry et ils sont identiques.
    Voici le programme:

    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
    #! /usr/bin/python
    #-*- coding:Utf-8-*-
     
    from Tkinter import *
    import MySQLdb
     
    def save():
    #connexion reliée a la première fenêtre fen1
    id = edt1.get()
    nom = edt2.get()
    prenom = edt3.get() #'Gets' the data from Entry boxes E1, E2, E3, E4
    myquery = "INSERT INTO essai.personne (id, nom, prenom) VALUES (\'"+id+"\',\'"+nom+"\',\'"+prenom+"\')"
    db = MySQLdb.connect(host='localhost', user='root', passwd='', db='essai')
    curs = db.cursor()
    curs.execute(myquery)
    curs.close()
    db.commit()
     
    def enr():
    #connexion reliée a la première fenêtre fen2
    id_clas=ed1.get()
    libelle = ed2.get()
    nbre=ed3.get()
    myquery = "INSERT INTO essai.classe (id_clas, libelle, nbre) VALUES (\'"+id_clas+"\',\'"+libelle+"\',\'"+nbre+"\')"
    db = MySQLdb.connect(host='localhost', user='root', passwd='', db='essai')
    curs = db.cursor()
    curs.execute(myquery)
    curs.close()
    db.commit()
     
     
     
    def new():
    # fonction de creation de fenêtre fen2
    fen2=Toplevel()
    fen2.grab_set()
    fen2.focus_set()
    fen2.geometry("300x300")
    fen2.resizable(False,False)
    fen2.title("classe")
    te1=Label(fen2, text='N° de la classe:')
    te2=Label(fen2, text='Nom de la classe:')
    te3=Label(fen2, text='Nombre d eleve:')
    ed1=Entry(fen2, bg ='orange')
    ed2=Entry(fen2, bg ='white')
    ed3=Entry(fen2, bg ='green')
    Btn0=Button(fen2,text='Quitter',command=fen2.destroy)
    Btn1=Button(fen2,text='OK', command=enr)
    te1.grid(row =0)
    te2.grid(row =1)
    te3.grid(row =2)
    ed1.grid(row =0, column =1)
    ed2.grid(row =1, column =1)
    ed3.grid(row =2, column =1)
    Btn0.grid(row =3, column =1)
    Btn1.grid(row =3, column =2)
     
    #fenêtre principale
    fen1=Tk()
    fen1.title("Formulaire de saisie")
    tex1=Label(fen1, text='N°:')
    tex2=Label(fen1, text='Nom:')
    tex3=Label(fen1, text='Prenoms:')
    edt1=Entry(fen1, bg ='green')
    edt2=Entry(fen1, bg ='green')
    edt3=Entry(fen1, bg ='green')
    Button0=Button(fen1,text='Quitter',command=fen1.quit)
    Button1=Button(fen1,text='OK', command=save)
    Button2=Button(fen1,text='classe', command=new) 
    tex1.grid(row =0)
    tex2.grid(row =1)
    tex3.grid(row =2)
    edt1.grid(row =0, column =1)
    edt2.grid(row =1, column =1)
    edt3.grid(row =2, column =1)
    Button0.grid(row =3, column =1)
    Button1.grid(row =3, column =2)
    Button2.grid(row =3, column =3)
     
    mainloop ()

    où se trouve l'erreur...... Merci

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    Je dirai la même chose que l’interpréteur (comme sa je ne suis sur de pas me tromper lol) : Qu'est ce que ed1 ?

    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
    #! /usr/bin/python
    #-*- coding:Utf-8-*-
     
    from Tkinter import *
    import MySQLdb
     
    def save():
        #connexion reliée a la première fenêtre fen1
        id = edt1.get()
     
    def enr():
        #connexion reliée a la première fenêtre fen2
        id_clas=ed1.get()
     
     
     
    def new():
        # fonction de creation de fenêtre fen2
        ...
        ed1=Entry(fen2, bg ='orange')
        ...
        ed1.grid(row =0, column =1)
        ...
        edt1=Entry(fen1, bg ='green')
        ...
        mainloop ()
    Le principe meme d'une fonction, c'est quelle ne touche pas aux variables des autres fonctions, lorsque le programme entre dans votre fonction "save" on lui demande de recuperer le contenu de ed1 mais pour lui cela ne correspond à rien... Normal il n'a encore rien en mémoire.

    Deux solutions :
    * 1) S'arranger pour mettre vos variables en global...
    * 2) Créer des classes

    Solution 1 :

    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
    #! /usr/bin/python
    #-*- coding:Utf-8-*-
     
    from Tkinter import *
    import MySQLdb
     
    def save():
        #connexion reliée a la première fenêtre fen1
        id = edt1.get()
     
    def enr():
        #connexion reliée a la première fenêtre fen2
        id_clas=ed1.get()
     
    # fonction de creation de fenêtre fen2
    ...
    ed1=Entry(fen2, bg ='orange')
    ...
    ed1.grid(row =0, column =1)
    ...
    edt1=Entry(fen1, bg ='green')
    mainloop ()
    Solution 2 :

    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
    #! /usr/bin/python
    #-*- coding:Utf-8-*-
     
    from Tkinter import *
    import MySQLdb
     
     
    class Appli():
     
        def save(self):
            #connexion reliée a la première fenêtre fen1
            id = self.edt1.get()
     
        def enr(self):
            #connexion reliée a la première fenêtre fen2
            id_clas=self.ed1.get()
     
        def __init__(self):
            # fonction de creation de fenêtre fen2
            ...
            self.ed1=Entry(fen2, bg ='orange')
            ...
            self.ed1.grid(row =0, column =1)
            ...
            self.edt1=Entry(fen1, bg ='green')
            ...
            mainloop ()
    Appli()
    J'ai du faire sa à la volé donc je n'ai pas pu testé mais je ne pense pas avoir oublié de choses...

    Tenez moi au courant et bon courage...

    Mickael

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut
    Bonjour

    Comme t'a dis Apocalypses ,la methode la plus simple est d'ssayer de définir ton Entry "ed1" comme variable global dans la fonction new() comme :

    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
    def new():
    # fonction de creation de fenêtre fen2
        ed1 global
        fen2=Toplevel()
        fen2.grab_set()
        fen2.focus_set()
        fen2.geometry("300x300")
        fen2.resizable(False,False)
        fen2.title("classe")
        te1=Label(fen2, text='N° de la classe:')
        te2=Label(fen2, text='Nom de la classe:')
        te3=Label(fen2, text='Nombre d eleve:')
        ed1=Entry(fen2, bg ='orange')
        ed2=Entry(fen2, bg ='white')
        ed3=Entry(fen2, bg ='green')
        Btn0=Button(fen2,text='Quitter',command=fen2.destroy)
        Btn1=Button(fen2,text='OK', command=enr)
        te1.grid(row =0)
        te2.grid(row =1)
        te3.grid(row =2)
        ed1.grid(row =0, column =1)
        ed2.grid(row =1, column =1)
        ed3.grid(row =2, column =1)
        Btn0.grid(row =3, column =1)
        Btn1.grid(row =3, column =2)
    comme tu peux définire tes entrés sur la fenetre principale et ne pas mettre le .grid() que quand tu veux les afficher comme cela :

    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
    def enr():
    #connexion reliée a la première fenêtre fen2
        ed1.grid(row =0, column =1)
        id_clas=ed1.get()
        libelle = ed2.get()
        nbre=ed3.get()
        myquery = "INSERT INTO essai.classe (id_clas, libelle, nbre) VALUES (\'"+id_clas+"\',\'"+libelle+"\',\'"+nbre+"\')"
        db = MySQLdb.connect(host='localhost', user='root', passwd='', db='essai')
        curs = db.cursor()
        curs.execute(myquery)
        curs.close()
        db.commit()
     
    global
    fen1=Tk()
    fen1.title("Formulaire de saisie")
    tex1=Label(fen1, text='N°:')
    tex2=Label(fen1, text='Nom:')
    tex3=Label(fen1, text='Prenoms:')
    ed1=Entry(fen2, bg ='orange')
    edt1=Entry(fen1, bg ='green')
    edt2=Entry(fen1, bg ='green')
    edt3=Entry(fen1, bg ='green')
    Button0=Button(fen1,text='Quitter',command=fen1.quit)
    Button1=Button(fen1,text='OK', command=save)
    Button2=Button(fen1,text='classe', command=new) 
    tex1.grid(row =0)
    tex2.grid(row =1)
    tex3.grid(row =2)
    edt1.grid(row =0, column =1)
    edt2.grid(row =1, column =1)
    edt3.grid(row =2, column =1)
    Button0.grid(row =3, column =1)
    Button1.grid(row =3, column =2)
    Button2.grid(row =3, column =3)
     
    mainloop ()
    et ça marche bien , bon courage

Discussions similaires

  1. ouvrir une nouvelle fenêtre dans une taille déterminé
    Par lnikolanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/09/2005, 15h26
  2. Ouvrir une nouvelle fentre en grand ?
    Par Sylk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 15/09/2005, 13h14
  3. Ouvrir un lien dans une nouvelle fenêtre
    Par Le Lézard dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/12/2004, 14h43
  4. [ShellExecute] ouvrir une nouvelle fenêtre ie
    Par sony351 dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/11/2004, 18h39
  5. Réponses: 3
    Dernier message: 17/06/2004, 16h59

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