Table des matières

Utiliser la librairie python Tkinter

Écrire un programme, c'est bien, mais l'interfacer, c'est mieux !

“L'interfaquoi?”

L'interfacer, c'est le fait de lui créer une interface graphique !

Par défaut, quand nous exécutons notre code dans un IDE comme Pycharm, celui-ci se lance dans le terminal.
Avouer que ce n'est pas fort pratique!
Pour que notre programme soit plus convivial et surtout ergonomique, nous créons une interface graphique avec la librairie “Tkinter”.

Tkinter est un module de base intégré dans Python , normalement vous n'avez rien à faire pour pouvoir l'utiliser. L'un des avantages de Tkinter est sa portabilité sur les OS les plus utilisés par le grand public.

Installer Tkinter

Pour utiliser la librairie, nous devons au préalable l'installer.
Pour cela, rien de plus simple, nous effectuons la requête via la commande PIP.
Si vous n'avez pas encore utilisé la commande PIP, vous pouvez vous référer à cette page

Pour cela, entrer la commande dans votre terminal

>>> pip install tk

Les widgets

Pour créer un logiciel graphique vous devez ajouter dans une fenêtre des éléments graphiques que l'on nomme widget.
Ce widget peut être tout aussi bien une liste déroulante que du texte ou un champ d'entrée…

Hello world

Pour commencer notre première interface, rien de tel que le classique, mais indémodable “Hello Word”!

import tkinter as tk
 
fenetre = tk.Tk()
 
label = tk.Label(fenetre, text="Hello World")
label.pack()
 
fenetre.mainloop()

traduisons :

Pour indiquer à python qu'il doit importer la librairie, nous écrivons :

import tkinter as tk

Cela signifie que tu importes “tkinter”, et que tu l'appelles “tk”

Nous créons ensuite une variable nommée “fenetre” dans laquelle nous stockons la fonction “Tk()”

Entrée/input

# entrée
value = StringVar()
value.set("texte par défaut")
entree = tk.Entry(fenetre, textvariable=value, width=30)
entree.pack()

Récupérer la valeur d'un input

Pour récupérer la valeur d'un input il vous faudra utiliser la méthode get() :

def recupere():
    showinfo("Alerte", entree.get())
 
value = StringVar() 
value.set("Valeur")
entree = Entry(fenetre, textvariable=value, width=30)
entree.pack()
 
bouton = Button(fenetre, text="Valider", command=recupere)
bouton.pack()

La pasition des boutons

Nous pouvons placer nos boutons sur une grille.

Button(fenetre, text='L1-C1', borderwidth=1).grid(row=1, column=1)
Button(fenetre, text='L1-C2', borderwidth=1).grid(row=1, column=2)
Button(fenetre, text='L2-C3', borderwidth=1).grid(row=2, column=3)
Button(fenetre, text='L2-C4', borderwidth=1).grid(row=2, column=4)
Button(fenetre, text='L3-C3', borderwidth=1).grid(row=3, column=3)
clear = Button(btns_frame, text = "C", fg = "black", width = 32, height = 3, bd = 0, bg = "#eee", cursor = "hand2",
               command=lambda: bt_clear()).grid(row = 0, column = 0, columnspan = 3, padx = 1, pady = 1)

La grille

Il est possible de placer les éléments en raisonnant en grille:

Pour cela, nous imaginons dans notre tête des colonnes (verticales) et des lignes (horizontales).
La colonne se dit row et la ligne se dit colomn Pour positionner une boutons en haut à gauche de notre fenêtre, nous lui passons en paramètre row = 1 et en colomn = 1

for ligne in range(5):
    for colonne in range(5):
        Button(fenetre, text='L%s-C%s' % (ligne, colonne), borderwidth=1).grid(row=ligne, column=colonne)
 

Dans cette exemple, nous créons en mémoire la grille que nous allons utiliser par la suite pour positionner les boutons.

Les listes

Les listes permettent de récupérer une valeur sélectionnée par l'utilisateur.

# liste
liste = Listbox(fenetre)
liste.insert(1, "Python")
liste.insert(2, "PHP")
liste.insert(3, "jQuery")
liste.insert(4, "CSS")
liste.insert(5, "Javascript")
 
liste.pack()

Canvas

Un canvas (toile, tableau en français) est un espace dans lequel vous pouvez dessiner ou écrire ce que vous voulez:

# canvas
canvas = Canvas(fenetre, width=150, height=120, background='yellow')
ligne1 = canvas.create_line(75, 0, 75, 120)
ligne2 = canvas.create_line(0, 60, 150, 60)
txt = canvas.create_text(75, 60, text="Cible", font="Arial 16 italic", fill="blue")
canvas.pack()

Mais nous pouvons aussi créer d'autres éléments :

create_arc()        :  arc de cercle
create_bitmap()     :  bitmap
create_image()      :  image
create_line()       :  ligne
create_oval()       :  ovale
create_polygon()    :  polygone
create_rectangle()  :  rectangle 
create_text()       :  texte
create_window()     :  fenetre

Si vous voulez changer les coordonnées d'un élement crée dans le canevas, vous pouvez utiliser la méthode coords .

canvas.coords(élément, x0, y0, x1, y1)

Pour supprimer un élément, nous pouvons utiliser la méthode delet

canvas.delete(élément)

PanedWindow

Le panedwindow est un conteneur qui peut contenir autant de panneaux que nécessaire disposé horizontalement ou verticalement.

p = PanedWindow(fenetre, orient=HORIZONTAL)
p.pack(side=TOP, expand=Y, fill=BOTH, pady=2, padx=2)
p.add(Label(p, text='Volet 1', background='blue', anchor=CENTER))
p.add(Label(p, text='Volet 2', background='white', anchor=CENTER) )
p.add(Label(p, text='Volet 3', background='red', anchor=CENTER) )
p.pack()

Pour aller plus loin

Barre de menu

Il est possible de créer une barre de menu comme-ceci:

def alert():
    showinfo("alerte", "Bravo!")
 
menubar = Menu(fenetre)
 
menu1 = Menu(menubar, tearoff=0)
menu1.add_command(label="Créer", command=alert)
menu1.add_command(label="Editer", command=alert)
menu1.add_separator()
menu1.add_command(label="Quitter", command=fenetre.quit)
menubar.add_cascade(label="Fichier", menu=menu1)
 
 
 
 
 
 
menu2 = Menu(menubar, tearoff=0)
menu2.add_command(label="Couper", command=alert)
menu2.add_command(label="Copier", command=alert)
menu2.add_command(label="Coller", command=alert)
menubar.add_cascade(label="Editer", menu=menu2)
 
menu3 = Menu(menubar, tearoff=0)
menu3.add_command(label="A propos", command=alert)
menubar.add_cascade(label="Aide", menu=menu3)
 
fenetre.config(menu=menubar)

La grille:
Il est possible de placer les éléments en raisonnant en grille:

for ligne in range(5):
    for colonne in range(5):
        Button(fenetre, text='L%s-C%s' % (ligne, colonne), borderwidth=1).grid(row=ligne, column=colonne)
Button(fenetre, text='L1-C1', borderwidth=1).grid(row=1, column=1)
Button(fenetre, text='L1-C2', borderwidth=1).grid(row=1, column=2)
Button(fenetre, text='L2-C3', borderwidth=1).grid(row=2, column=3)
Button(fenetre, text='L2-C4', borderwidth=1).grid(row=2, column=4)
Button(fenetre, text='L3-C3', borderwidth=1).grid(row=3, column=3)