OUJOOD.COM
Tkinter peut afficher des images dans les widgets Label, Button et Canvas via la classe PhotoImage. Elle supporte nativement les formats PNG et GIF. Pour les JPEG, ICO, BMP et autres formats, la bibliothèque Pillow est nécessaire.
Afficher une image dans un Label
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("PhotoImage")
fenetre.geometry("360x260")
# Charger l'image — la variable DOIT rester en vie
image = tk.PhotoImage(file="photo.png")
label = tk.Label(fenetre, image=image)
label.pack(pady=10)
# Texte sous l'image
tk.Label(fenetre, text="Légende de l'image", fg="#555").pack()
fenetre.mainloop()
La règle la plus importante avec PhotoImage : la variable doit rester en vie pendant toute la durée d'affichage. Si elle est créée à l'intérieur d'une fonction sans être stockée dans self ou une variable de portée suffisante, Python la supprime par garbage collection et l'image disparaît — remplacée par un Label vide. C'est le bug le plus fréquent avec les images Tkinter.
Image dans un Button
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("320x180")
icone_valider = tk.PhotoImage(file="icone_valider.png")
icone_annuler = tk.PhotoImage(file="icone_annuler.png")
frame = tk.Frame(fenetre)
frame.pack(expand=True)
# compound="left" : icône à gauche du texte
tk.Button(frame, text=" Valider", image=icone_valider,
compound="left", command=lambda: print("Valider")).pack(side="left", padx=10)
tk.Button(frame, text=" Annuler", image=icone_annuler,
compound="left", command=lambda: print("Annuler")).pack(side="left", padx=10)
fenetre.mainloop()
Le paramètre compound contrôle la position de l'image par rapport au texte : "left", "right", "top", "bottom" ou "center" (image seule, sans texte visible).
Image sur Canvas
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("420x300")
canvas = tk.Canvas(fenetre, width=400, height=280, bg="white")
canvas.pack(padx=10, pady=10)
image = tk.PhotoImage(file="fond.png")
# Afficher au centre du Canvas — anchor="nw" pour coin supérieur gauche
canvas.create_image(200, 140, image=image, anchor="center")
# Dessiner par-dessus l'image
canvas.create_text(200, 30, text="Titre sur l'image",
font=("Arial", 16, "bold"), fill="white")
# Garder la référence pour éviter le garbage collection
canvas.image = image
fenetre.mainloop()
Sur un Canvas, on stocke la référence dans un attribut du canvas lui-même (canvas.image = image) pour la garder en vie. C'est une convention courante pour éviter le problème de garbage collection sans passer par une variable globale.
JPEG et autres formats avec Pillow
PhotoImage ne supporte pas les JPEG. Pillow comble ce manque :
import tkinter as tk from PIL import Image, ImageTk # pip install Pillow fenetre = tk.Tk() fenetre.geometry("400x320") # Ouvrir et redimensionner avec Pillow img_pil = Image.open("photo.jpg") img_pil = img_pil.resize((360, 240), Image.LANCZOS) # Convertir pour Tkinter image = ImageTk.PhotoImage(img_pil) label = tk.Label(fenetre, image=image) label.image = image # garder la référence label.pack(pady=10) fenetre.mainloop()
La chaîne est toujours : ouvrir avec Image.open(), manipuler (redimensionner, recadrer, filtrer), convertir avec ImageTk.PhotoImage(), afficher. Image.LANCZOS est le filtre de redimensionnement de meilleure qualité. Pillow est aussi utile pour les icônes de fenêtre quand on veut utiliser des fichiers ICO ou des formats non supportés par PhotoImage.
Par carabde | Mis à jour le 30 avril 2025