Mémento Tkinter


Tkinter 8.5 - New Mexico Tech
Widgets module ttk - TkDocs
Widgets module ttk - Python Tutorial

Code couleur et typographique
En italique, tous les éléments à remplacer (noms de variables, valeurs numériques, chaînes...) : en vert les noms de variables (sauf les noms de fenêtres en bleu), en bleu les fenêtres cibles (quelles qu'elles soient), en gris les valeurs (nombres, chaînes), en rouge les fonctions associées aux widgets ou aux événements (appelées usuellement callback) et en en violet les événements.
callback : fonction (sans autre paramètre que event) définie par l'utilisateur.
Rq : les couleurs sont des chaînes (noms ou code hexadécimal, voir plus loin).

Clic sur les titres encadrés en vert → lien vers la page dédiée.



Fenêtres Principale/Auxiliaire Principale/Modale

import tkinter as tk
from tkinter import ttk
nom_fenetre = tk.Tk()
nom_fenetre.title(chaîne)
nom_fenetre.geometry('largeur x hauteur + xo + yo')
nom_fenetre['bg']=couleur
nom_fenetre['fg']=couleur
...
nom_fenetre.mainloop()

autre_fenetre = tk.Toplevel()

Button

nom_bouton = ttk.Button(cible, text=chaîne, command=callback).pack()
nom_bouton.state(['disabled']), nom_bouton.state(['!disabled'])
command=lambda x,y : callback(x,y) ) si paramètres x, y à transmettre au moment de l'appel.

Label

Label non modifiable :

ttk.Label(cible, text=chaîne).pack()

Label modifiable :

nom_variable = tk.StringVar()
ttk.Label(cible, textvariable=nom_variable).pack()
nom_variable.set(chaîne)

Label avec image :

ttk.Label(cible, image=nom_image_Tkinter).pack() (voir "Images" plus loin)

Entry

nom_variable = tk.StringVar(), ou tk.DoubleVar ou tk.IntVar ou tk.BooleanVar
ttk.Entry(cible, textvariable=nom_variable [, width=largeur, autres options]).pack()
nom_variable.set(chaîne)

Canvas Gestion objets

nom_canvas = tk.Canvas(cible, bg=couleur, height=hauteur , width=largeur ).pack()
nom_canvas.create_line(x1, y1, x2, y2)
nom_canvas.create_rectangle(x1, y1, x2, y2)
nom_canvas.create_oval(x1, y1, x2, y2)
nom_canvas.create_polygon(...)
nom_canvas.create_text(x, y, text=chaîne)
nom_canvas.create_image(largeur,hauteur,image=PhotoImage(file=chemin_fichier))
Attributs (options)
width=entier, fill=couleur, outline=couleur, activefill=couleur, state='normal' ou 'disabled' ou 'hidden'
Notation : tagOrId = nom_objet ou tag (chaîne) ou id (numéro par ordre chronologique de création)
nom_canvas.coords(tagOrId) (renvoie les coordonnées)
nom_canvas.coords(tagOrId, x, y) (modifie les coordonnées)
nom_canvas.move(tagOrId, dx, dy)
nom_canvas.delete(tagOrId)
nom_canvas.itemconfig(tagOrId, attribut=valeur)
   Exemple : itemconfig(tagOrId, fill='blue'))
nom_canvas.findclosest(x, y), find_all(), find_enclosed(), find_overlapping()...
nom_canvas.itemcget(tagOrId, attribut)
   Exemple : itemcget(tagOrId, fill) renvoie la couleur de l'objet)

Tags
nom_canvas.create_rectangle(x1, y1, x2, y2, tags=('rectangle', 'jaune'))

Méthodes

nom_canvas.find_withtag('rectangle')
nom_canvas.gettags(tagOrId)
addtag, dtag...
event.widget.find_withtag("current") (tag éphémère de l'objet cliqué)

Voir événements : tag_bind

Radiobutton Checkbutton Combobox

nom_variable = tk.StringVar()
nom_variable.set(valeur)
ttk.Radiobutton(cible, text=chaîne, variable=nom_variable, value=valeur1, command=callback).pack()
ttk.Radiobutton(cible, text=chaîne, variable=nom_variable, value=valeur2, command=callback).pack()
nom_variable = tk.IntVar()
nom_variable.set(valeur)
ttk.Checkbutton(cible, text=chaîne, variable=nom_variable, command=callback).pack()
nom_variable =tk.StringVar()
nom_cbbox = ttk.Combobox(cible, textvariable=nom_variable).pack()
nom_cbbox['values'] = (valeur1, valeur2, valeur3...)
nom_cbbox.current(n) (n est l'index de l'une des valeurs de la liste)
nom_ccbox.bind('<<ComboboxSelected>>', callback)

Placement pack grid et place

Tous les widgets doivent être positionnés dans la fenêtre à l'aide d'une des trois méthodes suivantes.

pack(padx=entier , pady=entier , side=chaîne, fill=chaîne, expand=1)
   padx et pady sont les marges (en pixels) autour du widget
   side = 'left' ou 'right' ou 'top' ou 'bottom' (optionnel)
   fill = 'x' ou 'y' ou 'both' (optionnel)
   expand = 1 (optionnel)

grid(row=entier, column=entier, sticky=chaîne, padx=entier , pady=entier)
   row ou rospan (fusion de lignes), column ou comumnspan (fusion de colonnes)
   sticky='e' ou 'w' ou 'n' ou 's' ou 'ew' ou 'nw'... ou encore sticky=(tk.E, tk.N)...

place(height=entier , width=entier , x=entier , y=entier )

Menus et onglets

cible.option_add('*tearOff', False)
nom_barre_menu = tk.Menu(cible)
cible['menu'] = nom_barre_menu
nom_menu = tk.Menu(nom_barre_menu) (autant que de menus)
nom_barre_menu.add_cascade(menu=nom_menu, label=chaîne) (autant que de menus déroulants)
nom_menu.add_command(label=chaîne, command=callback) (autant que d'items par menu déroulant)
nom_menu.add_separator()
nom_barre_onglets = ttk.Notebook(cible) (placement nécessaire)
nom_onglet = ttk.Frame(nom_barre_onglets) (autant que d'onglets, placement nécessaire)
nom_barre_onglets.add(nom_onglet, text=chaîne) (autant que d'onglets)

Clavier

cible.bind(événement, callback)
cible.tag_bind(événement, callback)

Exemples d'événements "event" déclenchés par le clavier :

"<Key>", "<Up>", "<Down>", "<Left>", "<Right>", "<Return>", "<Cancel>", "<F1>", "<Space>", "A", "a", "1"...

Méthodes associées à l'événement event :

event.char (touche du clavier frappée), event.widget,...

Souris

cible.bind(événement, callback)
cible.tag_bind(événement, callback)

Exemples d'événements "event" déclenchés par la souris :

"<Button-1>", "<Button-3>", "<Double-Button-1>", "<B1-Motion>"

Méthodes associées à l'événement event :

event.x, event.y (coordonnées du clic)

Couleurs

Code couleur = chaîne hexadécimale. Exemple : '#658ba5'

RED

80

GREEN

80

BLUE

80

 

Images

Images au format png avec Pyzo, utiliser de préférence un chemin relatif (voir "Chemins" plus loin).

chemin_fichier = chaîne
nom_image_Tkinter = tk.PhotoImage(file=chemin_fichier) (crée une image au format Tkinter).

Exemples :

ttk.Label(cible, image=nom_image_Tkinter)

Ou bien

nom_objet = nom_canvas.create_image(x,y, image=nom_image_Tkinter)
Où (x,y) = coordonnées du centre de l'image.

Attention, pour utiliser une image, il existe deux façons de procéder :

  1. Utiliser un chemin complet de la forme tk.PhotoImage(file='U:\\mon_dossier\\informatique\\projet\\nom_image.png') ;
  2. Placer l'image dans le même dossier que le script python (celui-ci doit donc y être sauvegardé) et cliquer sur le coin inférieur droit du bouton de l'étoile des favoris dans l'explorateur de fichiers de pyzo et choisir "Aller dans ce dossier (shell courant)". Cf. copie d'écran ci-dessous.
Fenêtre - Widgets

Attention, avec pyzo, en cas de message d'erreur se terminant par : _tkinter.TclError: couldn't open "nom_image": no such file or directory. Il faut corriger l'erreur puis redémarrer le shell avant de relancer une exécution.

Pour déterminer le chemin jusqu’à un fichier, afficher l’arborescence dans Pyzo (menu Outils/File browser), faire un clic droit sur le fichier, copier/coller le chemin puis remplacer \ par \\
Le chemin U:\mon_dossier\informatique\projet\nom_image.png s'écrit dans pyzo : 'U:\\mon_dossier\\informatique\\projet\\nom_image.png'.

Sons

import simpleaudio as sa
wave_obj = sa.WaveObject.from_wave_file("path/to/file.wav")
play_obj = wave_obj.play()
play_obj.wait_done()

Chemins

Chemin absolu (liens externes) :
'https://fr.wikipedia.org/wiki/Wikip%C3%A9dia'.
Chemin relatif (liens internes) :
'images/image.png' ("image.png" situé dans le sous-dossier "images" du dossier courant).
'../images/image.png' ("image.png" situé dans le sous-dossier "images" du dossier parent du dossier courant).
Avec Pyzo, si le message d'erreur _tkinter.TclError: couldn't open nom_fichier: no such file or directory s'affiche, redémarrer le shell.

Pour déterminer le chemin jusqu’à un fichier, afficher l’arborescence dans Pyzo (menu Outils/File browser), faire un clic droit sur le fichier, copier/coller le chemin puis remplacer \ par \\
Le chemin U:\mon_dossier\informatique\projet\mon_image.png s'écrit dans pyzo : 'U:\\mon_dossier\\informatique\\projet\\mon_image.png'.