Une application Tkinter avec une classe
Une application Tkinter avec une classe
-
Objectifs
- Etre capable de programmer des applications tkinter avec des classes
-
Introduction
- La programmation orientée objet convient particulièrement bien au développement d’applications avec interface graphique.
- Il est vivement conseillé de développer ses applications Tkinter en utilisant une classe.
- Cela présente l’avantage d’encapsuler l’application de manière efficace et d’éviter ainsi l’utilisation de variables globales. Souvenez-vous, elles sont à bannir définitivement ! Une classe crée un espace de noms propre à votre application, et toutes les variables nécessaires seront ainsi des attributs de cette classe.
-
Exemple d’utilisation
-
Exemple sans utilisation classe
-
Exemple avec utilisation classe
- Reprenons notre petit exemple avec un label et un bouton :
-
Créer une classe
- C’est mieux de mettre notre application dans une classe:
- Pour créer une application en tant que classe:
-
Nommer la classe
- La classe doit porter un nom qui commence par une majuscule, comme recommandé dans les bonnes pratiques de la PEP8.
- L’argument passé dans les parenthèses indique que notre classe Application hérite de la classe tk.Tk.
-
Le constructeur
- Ligne 4 de l’exemple. On crée un constructeur, c’est-à-dire une méthode qui sera exécutée lors de l’instanciation de notre classe (à la ligne 16).
- Ligne 5 de l’exemple. On appelle ici le constructeur de la classe mère
tk.Tk.__init__()
. Application
dérive de tkinter.Tk, nous devons donc appeler le constructeur de tkinter.Tk (tkinter.Tk.__init__()).-
Initialiser l’interface graphique
- Ligne 6 de l’exemple. On appelle la méthode
self.creer_widgets()
de notre classe Application. Pour rappel, le self avant le.creer_widgets()
indique qu’il s’agit d’une méthode de notre classe (et non pas d’une fonction classique). - Ligne 8 de l’exemple. La méthode
.creer_widgets()
va créer des widgets dans l’application. - Ligne 9 de l’exemple. On crée un label en instanciant la classe
tk.Label()
. Notez que le premier argument passé est maintenant self (au lieu de racine précédemment) indiquant la fenêtre dans laquelle sera construit ce widget. - Ligne 9 de l’exemple. De même on crée un widget bouton en instanciant la classe tk.Button(). Là aussi, l’appel à la méthode
.quit()
se fait parself.quit
puisque la fenêtre est instanciée dans la variable self. Par ailleurs, on ne met ni parenthèses ni arguments àself.quit
car il s’agit d’une fonction callback. - Lignes 11 et 12 de l’exemple. On place les deux widgets dans la fenêtre avec la méthode .pack().
- Ligne 13 de l’exemple. Ici on autorise le lancement de notre application Tkinter en ligne de commande (python tk_application.py), ou bien de réutiliser notre classe en important tk_application.py en tant que module (import tk_application) (voir le cours Création de modules).
- Ligne 14 de l’exemple. On instancie notre application.
- Ligne 15 de l’exemple. On donne un titre dans la fenêtre de notre application. Comme on utilise de petits widgets avec la méthode pack(), il se peut que le titre ne soit pas visible lors du lancement de l’application. Toutefois, si on "étire" la fenêtre à la souris, le titre le deviendra. On pourra noter que cette méthode
.title()
est héritée de la classe mère Tk. - Ligne 16 de l’exemple. On lance le gestionnaire d’événements.
- Source:https://python.sdv.univ-paris-diderot.fr/20_tkinter/
-
Application
-
Énoncé
- On veut utiliser une classe Application pour créer une calculatrice dans laquelle on entre une expression mathématique à calculer (1254 x 1254), écrite en langage Python, et dont on veut faire afficher le résultat dans la fenêtre, juste en-dessous, et dont le visuel est le plus proche possible de l’image suivant:
- Un appui sur la touche Entrée du clavier déclenche l’opération de calcul et affiche le résultat
- Un appui sur la touche echap du clavier permet de revenir à l’état initial
-
Solution
import tkinter as tk
racine = tk.Tk()
label = tk.Label(racine, text="J'adore Python !")
bouton = tk.Button(racine, text="Quitter", command=racine.quit)
bouton["fg"] = "red"
label.pack()
bouton.pack()
racine.mainloop()
print("C'est fini !")
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.creer_widgets()
def creer_widgets(self):
self.label = tk.Label(self, text="J'adore Python !")
self.bouton = tk.Button(self, text="Quitter", command=self.quit)
self.label.pack()
self.bouton.pack()
if __name__ == "__main__":
app = Application()
app.title("Ma Première App :-)")
app.mainloop()
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.creer_widgets()
def creer_widgets(self):
self.grid()
# Création du label
self.label = tk.Label(self, text ="Saisir une opération mathématique : ")
self.label.grid(row=2, column=1, padx=3, pady=8)
# Création du champ de saisie pour l'opération
self.entryVariable = tk.StringVar()
self.Entry = tk.Entry(self,textvariable=self.entryVariable,
bg = 'white', width="20",
highlightbackground = "blue", font=("Helvetica", 14),
highlightcolor= "green")
self.Entry.grid(row=2, column=2, padx=3, pady=8)
self.Entry.focus_set()
self.Entry.bind("<Return>",self.evaluer)
# Création d'un label qui affiche le résultat
self.labelVariable = tk.StringVar()
self.label = tk.Label(self,textvariable=self.labelVariable,
font=("Helvetica", 20))
self.label.grid(row=4,column=1,columnspan=2, padx=3, pady=10)
##----- Création des boutons -----##
self.bouton = tk.Button(self, text='Quitter', width='30'
,bg='red',command=self.destroy)
self.bouton.grid(row=5, column=2, padx=5, pady=20)
def evaluer(self,event):
#self.label.configure(text='resultat = '+str(eval(entOperation.get())))
self.labelVariable.set( 'resultat = '+str(eval(self.entryVariable.get())))
def remiseZero(self,event):
self.labelVariable.set(u"")
self.entryVariable.set(u"")
if __name__ == "__main__":
app = Application()
app.title("Ma Première App :-)")
app.geometry("445x160")
app.bind("<Escape>", app.remiseZero)
##----- Programme principal -----##
app.mainloop()# Boucle d'attente des événements