Outils pour utilisateurs

Outils du site


dev:python:tkinter

Créer une interface graphique avec Tkinter

Présentation

Python intègre par defaut le module Tkinter permettant de créer des interfaces graphiques en offrant une passerelle entre Python et la bibliothèque Tk.

Cela permet de créer des fenêtres, des boutons, et de faire réagir vos objets graphiques à certains événements.

Création d'une première fenêtre qui affiche « Bonjour »

# -*-coding:Latin-1 -*
 # fenetre1.py
from tkinter import *
# Création d'une fenêtre racine de l'interface
fenetre = Tk()
 
# Création d'un label (ligne de texte) souhaitant la bienvenue
# Note : le premier paramètre passé au constructeur de Label est l'interface racine
champ_label = Label(fenetre, text="Bonjour")
 
# Affichage du label dans la fenêtre
champ_label.pack()
 
# On démarre la boucle Tkinter qui s'interompt quand on ferme la fenêtre
fenetre.mainloop()

La méthode pack du Label permet de positionner et donc d'afficher l'objet dans la fenêtre.

La méthode mainloop de notre fenêtre racine ne se termine que lorsqu'on ferme la fenêtre.

Les objets graphiques (boutons, champs de texte, cases à cocher, barres de progression…) sont appelés des widgets.

Pour accéder à la valeur actuelle de l'option du widget ou pour modifier les options du widget après sa création, on le précise entre crochets.

Exemple : changer « Bonjour «  par « Au revoir » :

>>> champ_label["text"] = "Au revoir"

Ajouter d'autres widgets

Démarche :

  • créer le widget en précisant ses options ;
  • il faut que premier paramètre du constructeur soit la fenêtre principale ;
  • faire appel à sa méthode pack qui permet de positionner un objet dans une fenêtre ou dans un cadre.

Un bouton

bouton_quitter = Button(fenetre, text="Quitter", command=fenetre.destroy)
bouton_quitter.pack()

Le dernier paramètre passé au constructeur de Button est l'action liée à un clic sur le bouton. Ici, c'est la méthode destroy de la fenêtre racine qui est appelée.

Une ligne de saisie

Ce widget est une zone de texte (ligne simple) dans lequel l'utilisateur peut écrire.

Il est préférable de créer une variable associée au champ de texte. Cette variable est un objet. Il faudra utiliser ses méthodes set() pour définir sa valeur et get() pour lire sa valeur.

var_texte = StringVar()
var_texte.set("Saisissez une adresse MAC")
ligne_texte = Entry(fenetre, textvariable=var_texte, width=30)
ligne_texte.pack()

La variable var_texte va contenir le texte affiché ou saisi dans le widget Entry. Pour lire l'information saisie dans le widget Entry :

showinfo("Alerte", ligne_texte.get())

Comme le widget Entry n'est qu'une zone de saisie, il faut utiliser un widget Label ou un widget Text (champ de texte à plusieurs lignes) pour indiquer à l'utilisateur ce qu'il doit écrire.

Pour avoir des précisions sur la création des widgets cases à cocher, boutons radio, listes déroulantes, consultez la page http://www.siteduzero.com/informatique/tutoriels/apprenez-a-programmer-en-python/de-nombreux-widgets

Organiser ses widgets dans la fenêtre

Il existe plusieurs widgets qui peuvent contenir d'autres widgets comme le widget Frame. C'est un cadre rectangulaire dans lequel vous pouvez placer vos widgets… ainsi que d'autres objets Frame si besoin est.

Pour faire apparaître un widget dans un cadre, utilisez le Frame comme parent à la création du widget :

cadre = Frame(fenetre, width=768, height=576, borderwidth=1)
cadre.pack(fill=BOTH)
message = Label(cadre, text="Notre fenêtre")
message.pack(side="top", fill=X)

Les arguments de la méthode pack :

  • side=“top” pour placer le widget en haut de son parent (ici, le cadre).
  • fill=BOTH pour que le widget remplisse le widget parent, soit en largeur si la valeur est X, soit en hauteur si la valeur est Y, soit en largeur et hauteur si la valeur est BOTH.

Les commandes

Pour fermer la fenêtre quand on clique sur un bouton, on précise en dernier argument, l'argument command avec comme valeur la méthode quit de la fenêtre.

Sur ce principe, vous pouvez créer simplement des commandes personnalisées, en écrivant des méthodes. Petite dificulté : la méthode à créer ne peut prendre aucun paramètre. Pour qu'un clic sur le bouton modifie le bouton lui-même ou un autre objet, il faut placer les widgets dans un corps de classe.

Cette classe va hériter de Frame, ce qui signifie que cette classe sera un widget elle aussi.

# -*-coding:Latin-1 -*
from tkinter import *
class Interface(Frame):   
    """fenêtre principale ; les widgets sont stockés comme attributs de cette fenêtre."""
 
    def __init__(self, fenetre, **kwargs):
        Frame.__init__(self, fenetre, width=768, height=576, **kwargs)
        self.pack(fill=BOTH)
        self.nb_clic = 0
 
        # Création des widgets
        self.message = Label(self, text="Vous n'avez pas cliqué sur le bouton.")
        self.message.pack()
 
        self.bouton_quitter = Button(self, text="Quitter", command=self.quit)
        self.bouton_quitter.pack(side="left")
 
        self.bouton_cliquer = Button(self, text="Cliquez ici", fg="red",
                command=self.cliquer)
        self.bouton_cliquer.pack(side="right")
 
    def cliquer(self):
        """clic sur le bouton donc changer la valeur du label message."""
        self.nb_clic += 1
        self.message["text"] = "Nb de clic : {0}".format(self.nb_clic)
 
# création et affichage de l'interface
fenetre = Tk()
interface = Interface(fenetre)
 
interface.mainloop()
interface.destroy()

Quelques précisions :

Création d'une classe qui contiendra toute la fenêtre et qui hérite de Frame, c'est-à-dire d'un cadre Tkinter. Dans le constructeur de la fenêtre, on appelle le constructeur du cadre et on pack (positionne et affiche) le cadre.

Dans le constructeur, on crée les différents widgets de la fenêtre (Position et les affichage).

Création d'une méthode bouton_cliquer, appelée quand on clique sur le bouton_cliquer. Elle ne prend aucun paramètre. Elle va mettre à jour le texte contenu dans le labelself.message, comptabiliser le nombre de clic et afficher ce nombre de clics.

On crée la fenêtre Tk qui est l'objet parent de l'interface que l'on instancie ensuite.

On rentre dans la boucle mainloop. Elle s'interrompra quand on fermera la fenêtre.

Ensuite, on détruit la fenêtre grâce à la méthode destroy.

Programme WoL à créer

Créer un programme Python avec interface graphique qui permet de saisir une adresse MAC pour ensuite réveiller un ordinateur éteint.

Des liens pour vous aider

dev/python/tkinter.txt · Dernière modification: 2015/11/24 12:02 (modification externe)