Les menus - Tkinter
PROBLÉMATIQUE
Je souhaite créer un éditeur de texte, permettant de lire, modifier et sauvegarder un fichier.
LE FRAMEWORK TKINTER
Le framework tkinter permet de créer des interfaces graphiques hommes-machine...
Question beauté des interfaces, ce n'est pas ce qui se fait de plus beau, mais question simplicité, et rapidité de codage, on a pour l'instant pas trouver mieux !
Pour importer le module Tkinter, il suffit de faire sous cette forme
Code:
import tkinter as tk
Donc je vous conseille vivement cette manière de suivre qui est une convention pour les expérimentés Python, voir PEP8 qui dit
Wildcard imports ( from <module> import * ) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools. There is one defensible use case for a wildcard import, which is to republish an internal interface as part of a public API (for example, overwriting a pure Python implementation of an interface with the definitions from an optional accelerator module and exactly which definitions will be overwritten isn't known in advance).
Pour créer notre éditeur de texte, il nous faut une fenêtre simple où nous ajouterons par la suite,
- Une barre de menu
- Les options de la barre (File, Edit, ...)
- Les actions liées à chaque option (pour File, open, save, ...)
- Un cadre pour lire les résultats des actions
Tout d'abord la fenêtre principale
Code:
# Créer la fenêtre parente root = tk.Tk()
Code:
root.mainloop() # en fin de code
Pour créer notre barre de menu, nous allons utiliser l'objet Menu, je vais appeler cette barre, menubar
Code:
menubar = tk.Menu(root)
Menu est une classe que l'on va initialisée! Elle prendra évidemment en paramètre la fenêtre sur laquelle on souhaite ajouter notre barre de menu, c'est à dire dans notre cas, root.
CRÉATION DES OPTIONS DE LA BARRE DE MENU
On utilisera la classe Menu pour faire cela aussi...
Code:
filemenu = tk.Menu(menubar, tearoff=0) editmenu = tk.Menu(menubar, tearoff=0) menubar.add_cascade(label='File', menu=filemenu) menubar.add_cascade(label='Edit', menu=editmenu)
CRÉATION DES ACTIONS POUR CHAQUE OPTION
Pour faire cela, on doit avoir deux informations:
- Le nom de l'action (une chaîne de caractères)
- L'action sous forme d'une fonction (sans argument)
Pour l'option File (variable filemenu) ça donnera par exemple
Code:
filemenu.add_command(label='Ouvrir', command=fopen) filemenu.add_command(label='Sauvegarder', command=save) filemenu.add_command(label='Quitter', command=root.quit) # quitte le programme
Que cela ne tienne, j'en crée une pour fopen
Code:
def fopen(): currentPath = os.getcwd() # Chemin courant myFile = filedialog.askopenfile\ ( mode='r', defaultextension='.txt', initialdir=currentPath ) # Ouverture de la fenêtre pour choisir le fichier content = myFile.read() # Texte du fichier ouvert text.insert(tk.END, content) # Insertion du texte dans le widget Text
Code:
from tkinter import filedialog
Code:
def save(): ''' à compléter ''' pass
AFFICHAGE DE LA BARRE DE MENU SUR LA FENÊTRE
Ne surtout pas oublier, sinon vous ne verrez rien, c'est une ligne toute bête, mais souvent elle est oubliée, car souvent on copie du code sans comprendre... Ici je vous l'explique, ça va rendre visible votre barre de menu !
Code:
root.config(menu=menubar)
Voici le code testable, il permet d'assurer les objectifs fixés au départ, avec l'opportunité pour vous de le compléter, car un éditeur de texte est plus complexe que cela, vous vous en doutez !
Code:
from tkinter import filedialog import tkinter as tk import os # Les différentes actions à executer def fopen(): currentPath = os.getcwd() # Chemin courant myFile = filedialog.askopenfile\ ( mode='r', defaultextension='.txt', initialdir=currentPath ) # Ouverture de la fenêtre pour choisir le fichier content = myFile.read() # Texte du fichier ouvert text.insert(tk.END, content) # Insertion du texte dans le widget Text def save(): ''' à compléter ''' pass # ---------------------------------------------------------- # Programme principal # ---------------------------------------------------------- # Créer la fenêtre parente root = tk.Tk() # Création d'une fenêtre text pour ajouter le texte d'un fichier ouvert (pour l'exemple) text = tk.Text(root) text.pack() # Créer sa barre de menu dans la fenêtre parente menubar = tk.Menu(root) filemenu = tk.Menu(menubar, tearoff=0) editmenu = tk.Menu(menubar, tearoff=0) # Ajouter les différentes options dans la barre de menu menubar.add_cascade(label='File', menu=filemenu) menubar.add_cascade(label='Edit', menu=editmenu) # Ajouter les différentes actions pour chaque option filemenu.add_command(label='Ouvrir', command=fopen) filemenu.add_command(label='Sauvegarder', command=save) filemenu.add_command(label='Quitter', command=root.quit) # quitte le programme # Lancement de la boucle événementielle root.config(menu=menubar) root.mainloop()