Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > GUI
GUI Forum d'entraide sur les bibliothèques pour interfaces graphiques en Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/02/2011, 14h40   #1
ookahh1
Invité de passage
 
serge pol
Inscription : septembre 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : serge pol

Informations forums :
Inscription : septembre 2010
Messages : 2
Points : 0
Points : 0
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 :
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 :
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
ookahh1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h43   #2
Apocalypses
Membre confirmé
 
Avatar de Apocalypses
 
Homme
Étudiant
Inscription : novembre 2008
Messages : 296
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2008
Messages : 296
Points : 274
Points : 274
Envoyer un message via MSN à Apocalypses
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 :
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 :
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 :
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
Apocalypses est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h05   #3
Ismatus1
Nouveau Membre du Club
 
Homme
Développeur informatique
Inscription : 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 : 27
Points : 27
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 :
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 :
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
Ismatus1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h43.


 
 
 
 
Partenaires

Hébergement Web