ECINE 1 : TP Python
Série 9 : TKINTER
Dans ce TP, nous allons nous concentrer uniquement sur l’utilisation du module Tkinter pour la création
d’interfaces graphiques en Python.
Exercice 1
1 – Première fenêtre
a) Exécutez le code ci-dessous.
b) Que représente root ?
c) Que fait la méthode .geometry() ?
d) Que se passe-t-il quand on clique sur “Quitter” ?
import tkinter as tk
def main():
root = [Link]()
[Link]('Ma Fenêtre Tkinter')
[Link]('300x150')
label_bienvenue = [Link](root, text='Bonjour, Tkinter!')
label_bienvenue.pack(pady=10)
btn_quitter = [Link](root, text='Quitter', command=[Link])
btn_quitter.pack()
[Link]()
if __name__ == '__main__':
main()
2 – Modification d’un widget
a) Modifiez le texte du Label.
b) Changez le texte du bouton.
c) Modifiez la couleur de fond de la fenêtre.
3 – Interactivité simple
Ajoutez ce bouton à la fenêtre précédente, puis observez ce qu’il fait :
def saluer():
print("Bonjour depuis la console !")
btn_saluer = [Link](root, text="Dire Bonjour", command=saluer)
btn_saluer.pack()
Que fait ce bouton ? Que signifie command=saluer ?
Exercice 2
1 – Champ de saisie
Complétez le code pour qu’un utilisateur puisse entrer son nom et voir s’afficher un message
personnalisé.
2 – Interface structurée avec Frame
a) Créez deux Frame : une en haut pour la saisie, une en bas pour la sélection.
b) En haut : un champ Entry pour le nom.
c) En bas : une Listbox avec plusieurs options, un bouton « Valider », et un Label pour afficher la
sélection.
3 – Menus simples
a) Créez une barre de menus.
b) Ajoutez un menu « Fichier » → « Quitter ».
c) Ajoutez un menu « Aide » → « À propos » (affiche une boîte d’information).
Exercice 3
1 – Mini Calculatrice
Créez une application Tkinter qui simule une calculatrice simple :
a) Deux champs Entry permettent à l’utilisateur de saisir deux nombres.
b) Quatre boutons permettent d’effectuer : addition, soustraction, multiplication, division.
c) Le résultat s’affiche dans un Label.
d) Utilisez grid() pour organiser les widgets dans un tableau.
Bonus :
- Gérez la division par zéro.
- Affichez un message clair si l’utilisateur entre un texte au lieu d’un nombre.
2 – Formulaire interactif
Créez un formulaire contenant :
a) Champ de nom
b) Liste déroulante (OptionMenu ou Combobox)
c) Bouton de validation
d) Affichage du résumé dans un Label
3 – Gestion dynamique d’une liste
Créez une interface permettant :
a) D’ajouter un élément dans une Listbox
b) De supprimer un élément sélectionné
c) D’afficher tous les éléments dans un Label
FICHE INTERFACE GRAPHIQUE
Bibliothèque à importer pour
créer des applications from tkinter import *
graphiques On importe toutes les classes.
fen_princ = Tk()
Création d’une fenêtre # Insérer ici vos différents widgets
fen_princ.mainloop()
Afficher un widget rattaché à [Link]()
une fenêtre
Il existe d’autres façons d’afficher les widgets.
WIDGET Label : Pour afficher un texte
monAffichage = Label(fen_princ, text="Mon texte ici !")
Création d’un objet-Label [Link]()
Première indication fen_princ : Désigne la fenêtre à laquelle le widget est rattaché
Attribut text text="Mon texte ici !" : On donne le contenu du Label.
Attribut foreground fg fg="red" : Couleur du texte
Attribut background bg bg="black" : Couleur du fond
Attribut font font=("Helvetica", 32) : Police taille 32 en Helvetica
Attribut height height = 3 : Le Label s’étend sur 3 lignes
Attribut width width = 15 : permet de définir la largeur du Label
anchor= W : permet d’ancrer le texte à la bordure gauche(West)
Attribut anchor
Les autres possibilités : CENTER, N, S, W, E, NE, NW, SEW, SW
wraplength=800 : permet de fixer la longueur (en mesure-écran) à partir de
Attribut wraplength
laquelle on passe en mode multiligne.
monTexte = StringVar() # Création d’un objet StringVar
[Link]("Hello World !") # Affectation via méthode set
monAffichage = Label(fen_princ, textvariable=monTexte)
Attribut textvariable [Link]() # Affichage du widget monAffichage
Permet de donner le texte à Pour modifier le contenu du Label : [Link]("Bonjour le Monde !")
afficher dans un objet-String Attention, on utilise set avec StringVar et pas l’affectation des Strings avec =.
particulier, un string variable, de
classe StringVar. Pour lire le contenu de monTexte, deux techniques :
lecture = [Link]()
lecture = [Link]()
Méthode cget() pour lire le contenu des attributs
Exemple 1 : Lecture de la [Link]('fg')
couleur de fond
Exemple 2 : Lecture du texte [Link]('text')
du Label Text
1
Méthode config ou configure pour modifier le contenu des attributs
Exemple 1 : Modification de [Link](fg='red')
la couleur de fond
Exemple 2 : Modification du [Link](text='nouveau texte à afficher')
texte du Label Text
Remarque : Si les modifications sont courantes et si elles peuvent affecter plusieurs widgets, autant utiliser un
StringVar.
WIDGET Button : Pour activer le code d’une fonction
Création d’un monBouton = Button(fen_princ, text="Appuyez !", command=mise_a_jour)
objet-Button [Link]()
Première
fen_princ : Désigne la fenêtre à laquelle le widget est rattaché
indication
Attribut text Cet attribut permet de définir le texte qui s’affichera : text="Appuyer ici !"
Attribut Lorsqu’on cliquera sur le bouton, cela enclenchera la fonction mise_a_jour
command command=mise_a_jour # Attention, on ne place pas les parenthèses()
def mise_a_jour():
[Link]("Et voilà !")
Exemple de code
fen_princ = Tk()
intégrant un monTexte = StringVar()
Button qui
[Link]("Hello World !")
change le texte monAffichage = Label(fen_princ, textvariable=monTexte)
d’un Label ayant [Link]()
un texte variable : monBouton = Button(fen_princ, text="Changer !", command=mise_a_jour)
[Link]()
fen_princ.mainloop()
WIDGET Entry : Pour récupérer du texte tapé par l’utilisateur
Création d’un objet-Entry
associé à un StringVar
nom_fichier = StringVar()
nom_fichier.set( "mp_rgb_1.jpg" )
entree_fichier = Entry(fen_princ, textvariable=nom_fichier, width=30)
entree_fichier.pack()
Première indication fen_princ : Désigne la fenêtre à laquelle le widget est rattaché
Attribut textvariable Cet attribut permet de définir le nom de l’objet StringVar associé à cet Entry.
Attribut width width = 30 : permet de définir la largeur du Entry, comme pour Label.
Il faut utiliser la méthode get() soit sur le StringVar, soit sur l’Entry :
Lire le texte rentré print(nom_fichier.get())nom_fichier.set( "mp_rgb_1.jpg" )
print(entree_fichier.get())
2
WIDGET Label : Pour afficher une image
La classe Image de base de la bibliothèque PIL n’est pas interprétable par la bibliothèque
Classe Image Tk. Une fois l’image créée et modifiée via Image (la classe de l’obket-image du module
et PIL), on peut la transformer en ImageTk , la classe-image de Tk, qui sera alors utilisable
Classe Tk dans Tkinter. Il faut utiliser la méthode PhotoImage.
et
Conversion à l’aide de la
méthode PhotoImage from PIL import Image as Img
de la classe ImageTk. from PIL import ImageTk
presentation = [Link]("RGB", (20,20), (255,255,150))
presentationTk = [Link](presentation)
monAffichage = Label(fen_princ, image=presentationTk)
Création d’un objet- [Link]()
Label
Attention : le nom de l’image doit correspondre à une image convertie avec
[Link] () et pas une Image PIL directement.
Modifier l’image qui Si vous voulez afficher une image depuis un objet-image Tk pré-existant, c’est facile :
s’affiche avec une
image préexistante [Link](image = presentationTk_nouvelle)
dans le corps du
programme Bien entendu, presentationTk_nouvelle devra être le nom de la nouvelle image Tk.
Modifier l’image qui
s’affiche avec une
image créée dans une C’est plus compliqué : il faudra attendre les activités suivantes.
fonction liée à un
bouton par exemple
Suppression de la console
Pour supprimer l’ouverture de la console lors de l’exécution d’un programme utilisant tkinter, il suffit de modifier
l’extension du fichier .py en .pyw.
Méthode GEOMETRY
Impose initiale de la Pour créer une fenêtre de 800 pixels de long sur 600 pixels de haut :
fenêtre lors du
lancement fen_princ.geometry("800x600")
Méthode PLACE
Pour placer un Widget à une position de 50 pixels en x et 100 pixels en y :
Permet le placement [Link]( x = 50, y = 100 )
précis des WIDGETS
ATTENTION : Il ne faut pas mélanger les méthodes de placements dans un même
conteneur.