Annonce

Réduire
Aucune annonce.

Création d'un menu à l'aide du framework Tkinter - COURS N°10

Réduire
Ceci est une discussion importante.
X
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Création d'un menu à l'aide du framework Tkinter - COURS N°10

    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
    Alors pourquoi as tk et pas from tkinter import *, tout simplement pour que vous puissiez utiliser la forme tk.widget, qui permet de renseigner tout de suite que le nom du widget est une instance de tkinter.

    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).
    CRÉATION D'UNE FENÊTRE PRINCIPALE

    Pour créer notre éditeur de texte, il nous faut une fenêtre simple où nous ajouterons par la suite,
    1. Une barre de menu
    2. Les options de la barre (File, Edit, ...)
    3. Les actions liées à chaque option (pour File, open, save, ...)
    4. 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()
    Pas compliqué, n'est-ce pas ? Pourtant c'est de là que tout commence et que ça devra se terminer à l'aide d'une méthode mainloop qui permettra de démarrer la boucle événementielle contrôlant toutes les interactions entre utilisateur et interface graphique.

    Code:
    root.mainloop() # en fin de code
    CRÉATION D'UNE BARRE DE MENU

    Pour créer notre barre de menu, nous allons utiliser l'objet Menu, je vais appeler cette barre, menubar

    Code:
    menubar = tk.Menu(root)
    menubar est une instance de la classe Menu.
    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)
    tearoff permet d'indiquer un détachement entre les options et les actions qu'on ajoutera par la suite...

    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
    Euh ouais tonton, mais fopen, save ça n'existe pas ! Par contre je connais root.quit ça permet de quitter 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
    Attention pour filedialog, il faut l'importer spécifiquement de tkinter et getcwd a besoin du module os

    Code:
    from tkinter import filedialog
    Par contre pour save, je vous laisse faire si vous voulez, c'est pas plus compliqué !

    Code:
    def save():
    	''' à compléter '''
    	pass
    Bref vous testerez le code principal, ça vous donnera une idée de ce que ça fait, l'objectif ici, c'est de parler de la création d'un menu avec le framework Tkinter.

    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)
    LE CODE DANS SA GLOBALITÉ

    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()
    Merci de m'avoir lu et bonne journée...
Chargement...
X