Mini Projet Python : Création d'un éditeur de texte partie1

Mini Python Project: Creating a text editor part1 Creating the system tree Before you start coding, you need to do a design of your system: 1. library: represents the directory of the system libraries (modules and classes). This directory contains an empty file called __init__.py that tells the Python interpreter that it is the directory of a module. 2. library.py: Represents the system library that will contain all the Python classes needed to run the system. 3. main.py: Represents the main file with which the system starts. This file contains very little code, usually the instances of the classes that are on the library library.  

1 -  Création de l’arborescence du système

Avant de commencer à coder, vous devez faire une conception de votre système. Nous vous proposons la suivante:




  1. library : représente le répertoire des librairies du système ( modules et classes). Ce répertoire contient un fichier vide nommé __init__.py qui indique à l'interpréteur de Python qu'il s'agit du répertoire d'un module.
  2. library.py : représente la bibliothèque du système qui va contenir toutes les classes Python nécessaire au fonctionnement du système.
  3. main.py : représente le fichier principal avec lequel démarre le système. Ce fichier ne contient que très peu de code, généralement les instances des classes qui se trouvent sur la bibliothèque library.py

2- Le code du fichier library.py

2.1 Importation de la bibliothèque tkinter

L'éditeur que nous souhaitons créer, manipule des objets graphique: fenêtres, boutons, labels, boite de dialogue...Pour cela nous devons importer une bibliothèque graphique. Nous utilisons la bibliothèque Tkinter pour ce projet:

from tkinter import * 
import os
savedFile = {1:""}

NB :

la troisième ligne nous permettra de stocker les objets files qui ne tiennent pas dans une instance de classe.

2.2-  Création de la classe principale du fichier library.py

from tkinter import *
import os
savedFile = {1:""}
class Win:     
    def __init__(self,master,content):
        # Fenêtre principale        
        self.master = master         
        # Main Text Widget
        self.content=content
    # Création de la fenêtre tkinter   
    def create(self):         
        self.master = Tk()         
        self.master.title("Editeur de Texte")         
        self.master.geometry("700x550")
    # Méthode qui ajoute la zone de texte                   
    def add_text(self):         
        self.content = Text(self.master)           
        self.content.pack(expand=1,fill='both')
    # Génération de la fenêtre principale             
    def generate(self):         
        self.master.mainloop()

2.3- Ajout des menus

Pour bien comprendre la méthode d'ajout des menus, veuillez réviser le tutoriel(page18) sur les menus. Nous passons directement au code qui permet d'ajouter  une méthode add_menu( ) qui permet de jouer l'affaire:




    def add_menu(self):         
        # 1 - Création de la barre des menus         
        menuBar = Menu(self.master)                  
        # 2 - Création du menu Fichier         
        menuFichier = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Fichier", menu=menuFichier)           
        # Création des sous menus du menu Fichier
        menuFichier.add_command(label="Nouveau", command=self.nouveau)          
        menuFichier.add_command(label="Ouvrir", command=self.fopen)         
        menuFichier.add_command(label="Enregistrer", command=self.save)         
        menuFichier.add_command(label="Enregistrer sous", command=self.saveAs)         
        menuFichier.add_command(label="Quitter", command = self.quitter)           
                          
        #3 - Création du Menu Edition         
        menuEdition= Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Edition ", menu=menuEdition)         
        menuEdition.add_command(label="Annuler")          
        menuEdition.add_command(label="Rétablir")                 
        menuEdition.add_command(label="Copier", command=self.copy)         
        menuEdition.add_command(label="Couper", command = self.cut)         
        menuEdition.add_command(label="Coller", command=self.past)                 
        #4 - Création du Menu Outils         
        menuOutils = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Outils", menu = menuOutils)         
        menuOutils.add_command(label="Préférences")                  
        # Création du Menu Aide         
        menuAide = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Aide", menu = menuAide)          
        menuAide.add_command(label="A propos")
		
		self.master.config(menu = menuBar)

2.4 - Ajout de commandes pour les  menus

Jusqu'à présent les menus crées ne sont pas fonctionnels, puisque nous leura avons pas encore crée des commandes ! Nous devons donc associer à  chaque menu une commande :

command = nom_de_la_commande

Nous devons ensuite créer une action pour chaque commande et qui porte le même nom :

def nom_de_la_commande():
        #code de l'action ici 

Code des actions des menus

#====================================== 
#  - Définition des actions des menus 
#====================================== 
#------------------------------ # 
 - actions du menu Fichier 
#-------------------------------     
   def quitter(self):         
       self.master.quit()     
   def nouveau(self):                  
       os.popen("python main.py")              
   def fopen(self):         
     file = self.master.filename =  filedialog.askopenfilename(initialdir = "/",title = "Select File",filetypes = (("Text Files","*.txt"),("all files","*.*")))     
      fp = open(file,"r")         
      r = fp.read()         
      self.content.insert(1.0,r) 
      # Menu Enregistrer sous  
   def saveAs(self):         
      # create save dialog         
     fichier=self.master.filename=filedialog.asksaveasfilename(initialdir =  "/",title = "Enregistrer Sous\         ",filetypes = (("Fichier Texte","*.txt"),  ("Tous les fichiers","*.*")))         
     fichier = fichier + ".txt" 
     # Utilisation du dictionnaire pour stocker le fichier                
     savedFile[1] = fichier         
     f = open(fichier,"w")         
     s = self.content.get("1.0",END)         
     f.write(s)          
     f.close()
     # menu Enregistrer
   def save(self):         
       if(savedFile[1] ==""):             
          self.saveAs()                     
       else:             
           f = open(savedFile[1],"w")             
       s = self.content.get("1.0",END)             
       f.write(s)              
       f.close()  
      #------------------------------ 
      #  - actions du menu Edition 
      #------------------------------     
   def copy(self):         
       self.content.clipboard_clear()          
       self.content.clipboard_append(self.content.selection_get())          
       def past(self):         
       self.content.insert(INSERT, self.content.clipboard_get())         
   def cut(self):         
       self.copy()         
       self.content.delete("sel.first","sel.last")    

Remarque

Les actions associées aux menus doivent être placées avant les fonctions qui définissent les menus

2.5- Code final du fichier library.py (Code sur pastbin )

# -*- coding: utf-8 -*- 
#------------------------------ 
# Author        : Y. DERFOUFI
# Author Title  : Professeur Agrégé de mathématiques & Docteur en Math-Informatiques
# Compagny      : CRMEF OUJDA 
#-----------------------------
from tkinter import *
import os
savedFile = {1:""}

#====================================== 
# 1 - Classe de la fenêtre pricipale 
#====================================== 
class Win:     
    def __init__(self,master,content):
        # Fenêtre principale        
        self.master = master         
        # Main Text Widget
        self.content=content
    # Création de la fenêtre tkinter   
    def create(self):         
        self.master = Tk()         
        self.master.title("Editeur de Texte")         
        self.master.geometry("700x550")
    # Méthode qui ajoute la zone de texte                   
    def add_text(self):         
        self.content = Text(self.master)           
        self.content.pack(expand=1,fill='both')
    # Génération de la fenêtre principale             
    def generate(self):         
        self.master.mainloop()

    #====================================== 
    #  2 - Définition des actions des menus 
    #====================================== 
    #------------------------------
    # 2.1 - actions du menu Fichier 
    #-------------------------------     
    def quitter(self):         
        self.master.quit()     
    def nouveau(self):                  
        os.popen("python main.py")              
    def fopen(self):         
      file = self.master.filename =  filedialog.askopenfilename(initialdir = "/",title = "Select File",filetypes = (("Text Files","*.txt"),("all files","*.*")))     
      fp = open(file,"r")         
      r = fp.read()         
      self.content.insert(1.0,r) 
      # Menu Enregistrer sous  
    def saveAs(self):         
       # create save dialog         
       fichier=self.master.filename=filedialog.asksaveasfilename(initialdir =  "/",title = "Enregistrer Sous\         ",filetypes = (("Fichier Texte","*.txt"),  ("Tous les fichiers","*.*")))         
       fichier = fichier + ".txt" 
       # Utilisation du dictionnaire pour stocker le fichier                
       savedFile[1] = fichier         
       f = open(fichier,"w")         
       s = self.content.get("1.0",END)         
       f.write(s)          
       f.close()
       # menu Enregistrer
    def save(self):         
        if(savedFile[1] ==""):             
           self.saveAs()                     
        else:             
            f = open(savedFile[1],"w")             
        s = self.content.get("1.0",END)             
        f.write(s)              
        f.close()  
    #------------------------------ 
    # 2.2 - actions du menu Edition 
    #------------------------------     
    def copy(self):         
        self.content.clipboard_clear()          
        self.content.clipboard_append(self.content.selection_get())          
        def past(self):         
        self.content.insert(INSERT, self.content.clipboard_get())         
    def cut(self):         
        self.copy()         
        self.content.delete("sel.first","sel.last")

    #====================================== 
    #  2 - Méthodes d'ajout des menus 
    #======================================
    def add_menu(self):         
        # 1 - Création de la barre des menus         
        menuBar = Menu(self.master)                  
        # 2 - Création du menu Fichier         
        menuFichier = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Fichier", menu=menuFichier)           
        # Création des sous menus du menu Fichier
        menuFichier.add_command(label="Nouveau", command=self.nouveau)          
        menuFichier.add_command(label="Ouvrir", command=self.fopen)         
        menuFichier.add_command(label="Enregistrer", command=self.save)         
        menuFichier.add_command(label="Enregistrer sous", command=self.saveAs)         
        menuFichier.add_command(label="Quitter", command = self.quitter)           
                          
        #3 - Création du Menu Edition         
        menuEdition= Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Edition ", menu=menuEdition)         
        menuEdition.add_command(label="Annuler")          
        menuEdition.add_command(label="Rétablir")                 
        menuEdition.add_command(label="Copier", command=self.copy)         
        menuEdition.add_command(label="Couper", command = self.cut)         
        menuEdition.add_command(label="Coller", command=self.past)                 
        #4 - Création du Menu Outils         
        menuOutils = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Outils", menu = menuOutils)         
        menuOutils.add_command(label="Préférences")                  
        # Création du Menu Aide         
        menuAide = Menu(menuBar,tearoff=0)         
        menuBar.add_cascade(label = "Aide", menu = menuAide)          
        menuAide.add_command(label="A propos")
		
		self.master.config(menu = menuBar)

3-  Code du fichier principal main.py (Code sur pastbin)

# -*- coding: utf-8 -*-
# Importation des bibliothèques nécessaires
from tkinter import * 
from tkinter import filedialog 

# Importation du module library.py
from library.library import*

# Création du dictionnaire qui stock les objets files
savedFile = {1:""} 

# Création d'une instance sur la classe principale
root = Win("root","c")

# Appel des méthodes qui créent l'objet fenêtre avec tous ces composants
root.create() 
root.add_text() 
root.add_menu() 
root.generate()

4 - Aperçu de l'éditeur

Si vous avez bien codé votre système et que tout va bien, voici l'aperçu de votre petit éditeur de texte :

 

Télécharger le projet





 

Younes Derfoufi
CRMEF OUJDA

 

5 thoughts on “Mini Projet Python : Création d'un éditeur de texte partie1

Leave a Reply