OVH Cloud OVH Cloud

Utilisation des classes dans Tkinter

2 réponses
Avatar
jean.moser
Voici un exemple de Tkinter sans usage de classes:

import sys
from Tkinter import *
root =3D Tk()

def fin():
sys.exit(0)

# Fonction puissance au carre
def pui2():
saisie =3D e.get()
chiffre=3D float(saisie)
lb["text"] =3D "Resultat" + str(chiffre*chiffre)

# Creation champ de saisie
e =3D Entry(root)
e=2Epack()

# Creation du bouton de l'instruction de mise au carre
bpui2 =3D Button (root,text =3D "Aucarre",command =3D pui2)
bpui2.pack()

# Label d'output
lb =3D Label (root,text =3D "Resultat:")
lb.pack()

root.mainloop()

J'ai essay=E9 de traiter cet exemple au moyen d'une classe MyApp.

Voici le programme:
from Tkinter import *
root =3D Tk()
class MyApp(Frame):
def __init__(self,master =3D None):
Frame.__init__(self,master)

def pui2 ():
saisie =3D e.get()
chiffre =3D float (saisie)
lb["text"] =3D "Resultat" + str(chiffre*chiffre)


e =3D Entry(root)
e.pack()

bpui2 =3D Button(root,text =3D "Aucarre",command =3D pui2)
bpui2.pack()
lb =3D Label (root,text =3D "Resultat:")
lb.pack()






root.mainloop()


En lan=E7ant de programme j'obtiens le message d'erreur suivant :

"Name error: global name 'e' is not defined"

Comment faut-il corriger ?

Merci de votre aide

Jean Moser

2 réponses

Avatar
Jerome
wrote:

snip

J'ai essayé de traiter cet exemple au moyen d'une classe MyApp.

Voici le programme:
from Tkinter import *
root = Tk()
class MyApp(Frame):
def __init__(self,master = None):
Frame.__init__(self,master)

def pui2 ():


attention, tu ne définis pas une méthode d'instance si tu ne mets pas
self en paramètre

saisie = e.get()
chiffre = float (saisie)
lb["text"] = "Resultat" + str(chiffre*chiffre)


e = Entry(root)
e.pack()

bpui2 = Button(root,text = "Aucarre",command = pui2)
bpui2.pack()
lb = Label (root,text = "Resultat:")
lb.pack()

root.mainloop()


En lançant de programme j'obtiens le message d'erreur suivant :

"Name error: global name 'e' is not defined"

Comment faut-il corriger ?

Merci de votre aide

Jean Moser



Il faut que tu déclares des variables d'instances pour avoir accès à tes
widgets tk, et utiliser ta classe MyApp en la liant à la fenêtre que tu
crées.


from Tkinter import *

class MyApp(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.e = Entry(root)
self.e.pack()
self.bpui2 = Button(root,text = "Aucarre",command = self.pui2)
self.bpui2.pack()
self.lb = Label (root,text = "Resultat:")
self.lb.pack()

def pui2 (self):
saisie = self.e.get()
chiffre = float (saisie)
self.lb["text"] = "Resultat" + str(chiffre*chiffre)

root = Tk()
myapp = MyApp(root)
root.mainloop()

Avatar
Jerome
Jerome wrote:
wrote:

snip


J'ai essayé de traiter cet exemple au moyen d'une classe MyApp.

Voici le programme:
from Tkinter import *
root = Tk()
class MyApp(Frame):
def __init__(self,master = None):
Frame.__init__(self,master)

def pui2 ():



attention, tu ne définis pas une méthode d'instance si tu ne mets pas
self en paramètre

saisie = e.get()
chiffre = float (saisie)
lb["text"] = "Resultat" + str(chiffre*chiffre)


e = Entry(root)
e.pack()

bpui2 = Button(root,text = "Aucarre",command = pui2)
bpui2.pack()
lb = Label (root,text = "Resultat:")
lb.pack()

root.mainloop()


En lançant de programme j'obtiens le message d'erreur suivant :

"Name error: global name 'e' is not defined"

Comment faut-il corriger ?

Merci de votre aide

Jean Moser



Il faut que tu déclares des variables d'instances pour avoir accès à tes
widgets tk, et utiliser ta classe MyApp en la liant à la fenêtre que tu
crées.


from Tkinter import *

class MyApp(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.e = Entry(root)
^^^^

self.e.pack()
self.bpui2 = Button(root,text = "Aucarre",command = self.pui2)
^^^^

self.bpui2.pack()
self.lb = Label (root,text = "Resultat:")
^^^^

self.lb.pack()


D'ailleurs tu dois aussi utiliser master à la place de root ici :)


def pui2 (self):
saisie = self.e.get()
chiffre = float (saisie)
self.lb["text"] = "Resultat" + str(chiffre*chiffre)

root = Tk()
myapp = MyApp(root)
root.mainloop()