lundi 10 août 2015

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

Citation:

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...


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/1gXtD1Z
via IFTTT

Aucun commentaire:

Enregistrer un commentaire