Label et Entry

Cette séance a pour but de voir comment gérer les entrées sorties dans une fenetre graphique.

Un exemple pour bien comprendre.



######################################
# Importation des modules nécessaires:
######################################


from tkinter import *
from tkinter.messagebox import *


####################################
# Creation de la fenetre principale:
####################################


Mafenetre = Tk()                
Mafenetre.title("Formulaire") 



######################################################################
# Creation de widgets Label pour afficher du texte dans la fenetre:
######################################################################


text1=Label(Mafenetre,text="Nom")
text2=Label(Mafenetre,text="Prénom")
text3=Label(Mafenetre, text="âge")

text1.pack()
text2.pack()
text3.pack()


####################################################################
# Creation de widgets Entry pour saisir du texte dans la fenetre:
####################################################################


nom=StringVar()                                 # Nécessaire pour définir la variable "nom" utilisée la ligne suivante 
champnom=Entry(Mafenetre,textvariable=nom)

prenom=StringVar()
champprenom=Entry(Mafenetre,textvariable=prenom)

age=StringVar()
champage=Entry(Mafenetre,textvariable=age)

champnom.pack()
champprenom.pack()
champage.pack()

Mafenetre.mainloop()                                     						         

Fermer l'image

La méthode pack() est pratique, comme vu dans la séance précédente, mais son aspect est simpliste:

pack

On va arranger cela à l'aide de la méthode grid() afin d'obtenir:
grid

Supprimer toutes les méthodes pack() et remplacer par:



text1.grid(row=0,column=0)  # Le texte sera placé dans un tableau fictif à la première ligne (row) et première colonne (column) 
text2.grid(row=1,column=0)
text3.grid(row=2,column=0)

champnom.grid(row=0,column=1)
champprenom.grid(row=1,column=1)
champage.grid(row=2,column=1)

On peut créer des cadres (frames) contenant des boites à l'aide de Frame :

frame
Pour obtenir cela, insérer les lignes suivantes:


text4=Label(Mafenetre,text="Remplissez le formulaire suivant")
text4.pack()

cadre=Frame(Mafenetre,bg ='blue', bd =4, relief =GROOVE)  # Crée un cadre dans Mafenetre sur fond bleu et en relief (il existe d'autre options...) 
cadre.pack(padx=10,pady=5)  # Espacement de 10 à gauche et à droite, et de 5 en haut et en bas 

Il faut ensuite indiquer que nos Label et Entry apparaissent dans le cadre: il faut donc changer dans ceux-ci les "Mafenetre" en "cadre". Voilà le programme final:



from tkinter import *
from tkinter.messagebox import *

Mafenetre=Tk()
Mafenetre.title("Formulaire")

text4=Label(Mafenetre,text="Remplissez le formulaire suivant")
text4.pack()


 # Le cadre 
cadre=Frame(Mafenetre,bg ='blue', bd =4, relief =GROOVE)
cadre.pack(padx=10,pady=10)

 # Les textes 
text1=Label(cadre,text="Nom")
text2=Label(cadre,text="Prénom")
text3=Label(cadre, text="âge")

 # Les entrées 
nom=StringVar()
champnom=Entry(cadre,textvariable=nom)
prenom=StringVar()
champprenom=Entry(cadre,textvariable=prenom)
age=StringVar()
champage=Entry(cadre,textvariable=age)


 # Le placement 
text1.grid(row=0,column=0)
text2.grid(row=1,column=0)
text3.grid(row=2,column=0)
champnom.grid(row=0,column=1)
champprenom.grid(row=1,column=1)
champage.grid(row=2,column=1)

Mafenetre.mainloop()

Récupérer les saisies...

Le but est évidemment de pouvoir récupérer les données saisies et de s'en servir!
Répondre au formulaire.
Fermer la fenetre
Puis dans la console, taper:


 >>> nom.get()

On remarque que les données récupérées sont de type chaine.
Ainsi, pour effectuer des cacluls avec l'age saisi, il faudra ajouter int(age.get()).
Pour éviter cela, on peut écrire age=IntVar() au lieu de age=StingVar() mais dans ce cas, un 0 apparait dans la zone de saisie... En fait, une zone de saisie vierge affiche la valeur nulle du type demandé: " " pour StringVar(), 0 pour IntVar().

Afficher un résultat...

Exemple:
On souhaite créer ce programme qui calcule l'IMC:

frame
1) Ajouter deux catégories au programme précédent: la taille et le poids.
2) Créer un bouton IMC commandant une fonction IMC qui à partir des données entrées taille.get() et poids.get() calcule l'IMC et l'affiche dans un nouveau label à droite du bouton.
(On rappelle que l'IMC est le poids divisé par la taille au carré.)

Exercice 1:
Créer ce programme qui permet à l'utilisateur de saisir un nombre et qui renvoie son cube en cliquant sur le bouton "cube".

frame

Exercice 2:
Créer ce programme qui permet à l'utilisateur d'ouvrir une image (cf séance précédente ) et qui renvoie le triplet RVB du pixel (x,y) où x et y sont demandés au préalable.

frame
On privilégiera les images au format .bmp pour éviter la perte de données due à la compression en .jpg.