Advertisement
Kaadem-85

jardin.py

Mar 31st, 2017
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 29.30 KB | None | 0 0
  1. #!/usr/bin/python3
  2. # -*- coding: utf8 -*-
  3.  
  4. #---------------------------------------------------------------------------------
  5.  
  6. # Copyright © 2016 Benoît Boudaud <https://twitter.com/Ordinosor>
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program.  If not, see <http://www.gnu.org/licenses/>
  19.  
  20. #---------------------------------------------------------------------------------
  21.  
  22. from tkinter import* # Importation du module tkinter
  23. from module_globs import Globales # Importation du module de redimensionnement
  24. import os # Fonctions basiques du système d'exploitation
  25. from PIL import Image, ImageTk  # Module PIL (traitement des images importées)
  26. from calendrier_perpetuel import Calendar # Importation du module calendrier
  27. from agenda_perpetuel import Agenda_perpetuel # Importation du module Agenda
  28. from module_notes import Notes # Improtation du module notes
  29. from phototheque_jardin import Phototheque_Jardin # Importation du module photothèque_jardin
  30. from legume import Legumes # Importation du module légumes
  31. from fruit import Fruits ## Importation du module fruits
  32. import tkinter.messagebox # Importation du module de création des fenêtres de dialogue
  33. import tkinter.filedialog # Importation du module.pour chosir un fichier.
  34. import shutil # Importation du module de copie
  35. import collections # Module servant à créer un dictionnaire ordonné
  36.  
  37. class Home(object):
  38.     "Instanciation de la page d'accueil"
  39.     def _init_(self):
  40.         """constructeur, méthode qui s'exécute automatiquement
  41.           lorsque un nouvel objet est créé par instanciation d'une classe."""
  42.  
  43. #- Méthode-----------------------------------------------------------------------------
  44.  
  45.     def home(self) :
  46.         "Instanciation de la page d'accueil"
  47.         self.directory = os.getcwd() # Retourne le répertoire courant
  48.         self.main_window = Tk() # Création de la fenêtre principale
  49.         self.main_window.title('Mon jardin 3.0') # Titre de la fenêtre
  50.         self.main_window.config(bg='white')
  51.         self.main_window.resizable(False, False) # Empêche le redimensionnement de la fenêtre
  52.        
  53.         self.size = Globales(self.main_window)  # Classe du module de redimensionnement.
  54.         self.h = round(self.size.height()) # Coefficient de hauteur
  55.         self.w = round(self.size.width()) # Coefficient de largeur
  56.        
  57.         self.home_image = "/images/mon_jardin.png" # Image de la page principale
  58.         self.image = Image.open(self.directory + self.home_image)
  59.         self.image_size = 512, 384
  60.         self.image.thumbnail(self.image_size) # Redimensionnement de l'image
  61.         self.photo = ImageTk.PhotoImage(self.image, master = self.main_window)
  62.        
  63.         self.main_frame = Frame(self.main_window, height = self.h*100, width = self.w*100, bg= 'white', relief = 'ridge', bd = 0)
  64.         self.main_frame.grid(row=0)
  65.         self.main_frame.grid_propagate(0)
  66.         self.homepage() # Appel de la méthode suivante:
  67.        
  68.         self.main_window.mainloop() # Démarrage du réceptionnaire d'événements.
  69.        
  70.     def homepage(self):
  71.         "Instanciation du bouton principal de la page d'accueil"
  72.         for child in self.main_frame.winfo_children(): # Destruction des widgets contenus dans le widget main_frame.
  73.             child.destroy()
  74.         self.home_accueil=LabelFrame(self.main_frame, text=' MON JARDIN ', labelanchor='n', font='Times 40 italic', bg='white', fg='green', relief='ridge', bd=3, padx=20, pady=20)
  75.         self.home_accueil.grid(row = 0, padx = (self.w*100)/2 - round(self.w*21), pady=self.h*15)
  76.         for child in self.home_accueil.winfo_children():
  77.             child.destroy()
  78.         self.titre=Button(self.home_accueil, image=self.photo, bg='green', relief='ridge', cursor = 'hand2', bd=3, padx=20, command=self.buttons) # Création du bouton
  79.         self.titre.grid()
  80.        
  81. #- Méthode-----------------------------------------------------------------------------
  82.        
  83.     def buttons(self):
  84.         "Création des boutons de la page menu"
  85.         self.titre.destroy() # Destruction du bouton de la page d'accueil
  86.         self.home_accueil.grid(row = 0, padx = (self.w*100)/2 - round(self.w*34), pady=self.h*15) # Repositionnement du widget qui contenait le bouton précédent pour accueillir d'autres widgets.
  87.         self.buttons_frame = Frame(self.home_accueil, bg='white', padx=20)
  88.         self.buttons_frame.grid()
  89.         self.images = ["/images/home.png" ,"/images/calendar.png" ,"/images/legumes.png" ,"/images/fruits.png","/images/post_it.png","/images/default_image.png"] # Images illustrant les boutons.
  90.         self.tabs_list=[]
  91.         self.row_number=0
  92.         self.column_number=0
  93.  
  94.         self.images_open = [Image.open(self.directory + i) for i in self.images] # Compréhension de liste
  95.         self.images_size = (172, 139)
  96.         [i.thumbnail(self.images_size) for i in self.images_open]
  97.         self.photos = [ImageTk.PhotoImage(i, master = self.main_window) for i in self.images_open] # Compréhension de liste
  98.  
  99.         for i, element in enumerate(self.images): # Création des boutons (Button et Menubutton)
  100.             self.tab = Menubutton(self.buttons_frame, bg = 'white', activebackground = 'white', relief = 'ridge', bd = 2, fg = 'white', font = 'Times 24 italic', cursor = 'hand2')
  101.             if i == 4 or i == 5 :
  102.                 self.tab = Button(self.buttons_frame, bg = 'white', activebackground = 'white', font = 'Times 24 italic', cursor = 'hand2')
  103.             self.tab.grid(row = self.row_number, column = self.column_number, padx = 50, pady = 50, sticky = 'ew')
  104.             self.column_number += 1
  105.             if self.column_number%3 == 0:
  106.                 self.row_number += 1
  107.                 self.column_number = 0
  108.             self.tabs_list.append(self.tab)
  109.            
  110.         for i, element in enumerate(self.tabs_list):
  111.             self.tabs_list[i].configure(image = self.photos[i])
  112.            
  113.         # Création du menu du bouton d'accueil:
  114.            
  115.         self.home_basic_func = Menu(self.tabs_list[0], bg = 'white', fg = 'green', bd = 2, relief = 'ridge', font = 'Times 14 italic')
  116.         self.home_basic_func.add_command(label = 'Page d\'accueil', underline = 0, command = self.homepage)
  117.         self.home_basic_func.add_command(label = 'Quitter', underline = 0, command = self.main_frame.quit)
  118.         self.tabs_list[0].configure(menu = self.home_basic_func)
  119.        
  120.         # Création du menu du bouton calendrier-agenda:
  121.        
  122.         self.calendar = Calendar()
  123.         self.agenda = Agenda_perpetuel()
  124.         self.agenda_basic_func = Menu(self.tabs_list[1], bg = 'white', fg = 'green', bd = 2, relief = 'ridge', font = 'Times 14 italic')
  125.         self.agenda_basic_func.add_command(label = 'Calendrier', underline = 0, command = self.calendar.calendar)
  126.         self.agenda_basic_func.add_command(label = 'Agenda', underline = 0, command = self.agenda.agenda_perpetuel)
  127.         self.tabs_list[1].configure(menu = self.agenda_basic_func)
  128.        
  129.         # Création de l'objet self.notes par instanciation de la classe Notes (ligne 28: module_notes):
  130.        
  131.         self.notes = Notes()
  132.         self.tabs_list[4].configure(command = self.notes.notes) # Appel de la méthode notes() de la classe Notes
  133.        
  134.         # Création de l'objet self.phototheque par instanciation de la classe Photothèque (ligne 29: module phototheque_jardin):
  135.        
  136.         self.phototheque = Phototheque_Jardin()
  137.         self.tabs_list[5].configure(command = self.phototheque.phototheque) # Appel de la méthode phototheque de la classe Phototheque
  138.        
  139.         self.show_list_vegetables() # Appel de la méthode définie ligne 138
  140.        
  141.         self.show_list_fruits() # Appel de la méthode définie ligne 249
  142.  
  143. #- Méthode-----------------------------------------------------------------------------
  144.  
  145.     def show_list_vegetables(self) :
  146.         "Méthode qui déroule la liste des légumes enregistrés dans le menu du bouton."
  147.         self.file_images_legumes = open("images_legumes", 'a') # Création en mode "append" du fichier "images_légumes".
  148.         self.file_images_legumes.close() # Fermeture du fichier (Attention! Ne pas oublier!)
  149.         with open("images_legumes", 'r') as self.file_images_legumes:
  150.             self.readfile_images_legumes = self.file_images_legumes.readlines() # Fermeture automatique du fichier  
  151.         self.file_legumes = open("legumes", 'a') # Création en mode "append" du fichier "légumes".
  152.         self.file_legumes.close() # Fermeture du fichier (Attention! Ne pas oublier!)
  153.         with open("legumes", 'r') as self.file_legumes:
  154.             self.readfile_legumes = self.file_legumes.readlines() # Fermeture automatique du fichier
  155.         self.dico_legumes = {} # Création d'un dictionnaire contenant le nom du légume et l'image associée à ce légume
  156.         self.dico_legumes = collections.OrderedDict(self.dico_legumes) # Création d'un dictionnaire ordonné.
  157.         for i, element in enumerate(self.readfile_legumes):
  158.             self.dico_legumes[i] = (self.readfile_images_legumes[i].strip(), self.readfile_legumes[i].strip()) # clé = int, valeur = tuple
  159.  
  160. # Création du menu déroulant:
  161.  
  162.         self.liste_object_vegetables = [] # Liste qui stocke les objets correspondant aux pages de légumes
  163.         self.vegetables_basic_func = Menu(self.tabs_list[2], bg = 'white', fg = 'green', bd = 2, relief = 'ridge', font = 'Times 14 italic')
  164.         self.vegetables_basic_func.add_command(label = 'Rajouter un légume', underline = 0, command = self.add_vegetable) # La commande appelle la méthode add_vegetable()
  165.         self.vegetables_basic_func.add_command(label = 'Supprimer un légume', underline = 0, command = self.remove_vegetable) # La commande appelle la méthode remove_vegetable()
  166.         for i, element in enumerate(self.dico_legumes): # Création des pages de légumes par instanciation de la classe Legumes
  167.             self.object_vegetables = Legumes(i, self.dico_legumes[i], "varietes_" + self.dico_legumes[i][1].lower(), "notes_" + self.dico_legumes[i][1].lower())
  168.             self.liste_object_vegetables.append(self.object_vegetables.legumes)
  169.             self.vegetables_basic_func.add_command(label = self.dico_legumes[i][1], underline = 0, command = self.liste_object_vegetables[i])
  170.         self.tabs_list[2].configure(menu = self.vegetables_basic_func)
  171.  
  172. #- Méthode-----------------------------------------------------------------------------
  173.        
  174.     def add_vegetable(self):
  175.         "Méthode qui ouvre une fenêtre pop-up pour rajouter un nouveau légume dans le menu déroulant."
  176.         self.rajout = Toplevel()
  177.         self.rajout.title("Rajouter un légume")
  178.         self.rajout_label = Label(self.rajout, text = "Veuillez entrer le nom du nouveau légume", font = "Times 14", pady = 5)
  179.         self.rajout_label.grid(row = 0, padx = 10)
  180.         self.champ_rajout = Entry(self.rajout, width = 30, font = "Times 14")
  181.         self.champ_rajout.grid(row = 1, padx = 10, pady = 10)
  182.         self.champ_rajout.bind('<Return>', self.save_new_vegetable) # Appel de la méthode d'enregistrement du nouveau légume.
  183.  
  184. #- Méthode-----------------------------------------------------------------------------
  185.  
  186.     def save_new_vegetable(self, event):
  187.         """Méthode qui enregistre un nouveau légume dans le menu déroulant et qui créé
  188.           la page associée."""
  189.         self.new_vegetable = self.champ_rajout.get().capitalize() # Récupération du nom du nouveau légume et ajout d'une majuscule au début du nom.
  190.         self.rajout.iconify() # Iconification de la fenêtre Toplevel
  191.         with open("legumes", 'r') as self.file_legumes:
  192.             self.readfile_legumes = self.file_legumes.readlines()
  193.         if self.new_vegetable + "\n" in self.readfile_legumes: # Si le légume est déjà présent dans la liste, ouverture d'une fenêtre d'avertissement:
  194.             tkinter.messagebox.showwarning("Légume déjà enregistré", "Ce légume est déjà enregistré.")
  195.         else:
  196.             with open("legumes", 'a') as self.file_legumes:
  197.                 self.file_legumes.write(self.new_vegetable + "\n") # Rajout du nom du nouveau légume dans le fichier "legumes"
  198.             self.new_file_legume = open("varietes_" + self.champ_rajout.get().lower(), 'a') # Création d'un fichier "variétés du légume" en mode "append".
  199.             self.new_file_legume.close()
  200.             self.new_file_notes_legume = open("notes_" + self.champ_rajout.get().lower(), 'a') # Création d'un fichier "notes concernant le légume" en mode "append"
  201.             self.new_file_notes_legume.close()
  202.             with open('images_legumes', 'a') as self.file_image :
  203.                 self.file_image.write("/images/default_image.png\n") # Attribution de l'image par défaut pour illustrer la nouvelle page "légumes".
  204.             self.show_list_vegetables()
  205.             self.import_picture = tkinter.messagebox.askquestion("Importer une image", "Le nouveau légume vient d'être rajouté. Souhaitez-vous importer une image pour illustrer la page " + self.new_vegetable + "?", icon = "question")
  206.             if self.import_picture == "yes" : # Réponse positive à la question précédente
  207.                 self.choose_picture = tkinter.filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','.*')])
  208.                 self.basename = os.path.basename(self.choose_picture) # Retourne le dernier élément d'un chemin
  209.                 shutil.copy(self.choose_picture, "images/images_importees") # Copie de l'image importée dans le dossier passé en deuxième argument.
  210.                 with open("images_legumes", 'r') as self.file_images_legumes:
  211.                     self.readfile_images_legumes = self.file_images_legumes.readlines()
  212.                     self.readfile_images_legumes = self.readfile_images_legumes[:-1] # Suppression de l'image par défaut
  213.                     self.readfile_images_legumes.append('/images/images_importees/' + self.basename + '\n') # Ajout de la nouvelle image
  214.                 with open("images_legumes", 'w') as self.file_images_legumes :
  215.                     for i, element in enumerate(self.readfile_images_legumes):
  216.                         self.file_images_legumes.write(self.readfile_images_legumes[i]) # Réécriture du contenu du fichier "images_légumes"
  217.         self.show_list_vegetables() # Appel de la méthode show_list_vegetables()
  218.  
  219. #- Méthode-----------------------------------------------------------------------------        
  220.            
  221.     def remove_vegetable(self):
  222.         "Méthode qui supprime un légume"
  223.         self.remove = Toplevel()
  224.         self.remove.title("Supprimer un légume")
  225.         self.remove_label = Label(self.remove, text = "Entrez le nom du légume à supprimer", font = "Times 14", pady = 5)
  226.         self.remove_label.grid(row = 0, padx = 10)
  227.         self.champ_remove = Entry(self.remove, width = 30, font = "Times 14")
  228.         self.champ_remove.grid(row = 1, padx = 10, pady = 10)
  229.         self.champ_remove.bind('<Return>', self.vegetable_to_remove) # Appel de la méthode de suppression du nouveau légume.
  230.  
  231. #- Méthode-----------------------------------------------------------------------------
  232.        
  233.     def vegetable_to_remove(self, event):
  234.         "Méthode qui supprime un légume."
  235.         self.remove_vegetable = self.champ_remove.get() # Récupération du nom du légume à supprimer.
  236.         self.remove.iconify() # Iconification de la fenêtre Toplevel()
  237.         self.confirmation_suppression = tkinter.messagebox.askokcancel("Supprimer ce légume?", "Voulez-vous vraiment supprimer ce légume?\nCette opération est irréversible et détruira toutes les données enregistrées.") # Message d'avertissement avant destruction définitive.
  238.         with open("legumes", 'r') as self.file_legumes:
  239.             self.readfile_legumes = self.file_legumes.readlines()
  240.         for i, element in enumerate (self.readfile_legumes):
  241.             if self.remove_vegetable.lower() == self.readfile_legumes[i].lower().strip():
  242.                 self.readfile_legumes.remove(self.readfile_legumes[i]) # Suppression du légume
  243.                 with open("legumes", 'w') as self.file_legumes: # Ouverture en mode "write" (= Effacement des données contenues dans le fichier.)
  244.                     for i2, element in enumerate(self.readfile_legumes):
  245.                         self.file_legumes.write(self.readfile_legumes[i2]) # Réécriture du fichier
  246.             with open("images_legumes", 'r') as self.file_images_legumes: # Ouverture en mode lecture et stockage des données du fichier dans la variable (de type liste) suivante:
  247.                 self.readfile_images_legumes = self.file_images_legumes.readlines()
  248.             if self.readfile_images_legumes[i] != "/images/default_image.png\n": # Suppression du chemin de l'image du légume si ce chemin est différent de l'image par défaut.
  249.                 self.to_remove = self.readfile_images_legumes[i] # Stockage dans une variable avant suppression
  250.                 self.readfile_images_legumes.remove(self.readfile_images_legumes[i]) # Suppression dans la liste
  251.         if self.to_remove not in self.readfile_images_legumes:
  252.             os.remove(self.directory + self.to_remove.strip()) # Suppression de l'image dans le répertoire si celle-ci n'est pas utilisée pour un autre légume (par erreur ou étourderie).
  253.         with open("images_legumes", 'w') as self.file_images_legumes : # Réécriture du fichier
  254.             for i, element in enumerate(self.readfile_images_legumes):
  255.                 self.file_images_legumes.write(self.readfile_images_legumes[i])
  256.         for i in os.listdir(self.directory): # retourne la liste des fichiers ou dossiers présent dans le répertoire passé en argument
  257.             if i.startswith("varietes_" + self.remove_vegetable.lower()): # Suppression du fichier "varietes_xxxx" contenant le nom du légume sans majuscule (.lower())
  258.                 os.remove(i)
  259.         if self.directory + "/notes_" + self.remove_vegetable.lower():
  260.             os.remove(self.directory + "/notes_" + self.remove_vegetable.lower()) # Suppression du fichier "notes_xxxx" contenant le nom du légume sans majuscule.
  261.         self.champ_remove.delete(0, 30) # Effacement du contenu du champ d'entrée
  262.         self.show_list_vegetables() # Appel de la méthode show_list_vegetables()
  263.  
  264. #- Méthode-----------------------------------------------------------------------------
  265.  
  266.     def show_list_fruits(self) :
  267.         "Méthode qui déroule la liste des fruits enregistrés dans le menu du bouton."
  268.         self.file_images_fruits = open("images_fruits", 'a') # Création en mode "append" du fichier "images_fruits".
  269.         self.file_images_fruits.close() # Fermeture du fichier (Attention! Ne pas oublier!)
  270.         with open("images_fruits", 'r') as self.file_images_fruits:
  271.             self.readfile_images_fruits = self.file_images_fruits.readlines() # Fermeture automatique du fichier  
  272.         self.file_fruits = open("fruits", 'a') # Création en mode "append" du fichier "fruits".
  273.         self.file_fruits.close() # Fermeture du fichier (Attention! Ne pas oublier!)
  274.         with open("fruits", 'r') as self.file_fruits:
  275.             self.readfile_fruits = self.file_fruits.readlines() # Fermeture automatique du fichier
  276.         self.dico_fruits = {} # Création d'un dictionnaire contenant le nom du fruit et l'image associée à ce fruit
  277.         self.dico_fruits = collections.OrderedDict(self.dico_fruits) # Création d'un dictionnaire ordonné.
  278.         for i, element in enumerate(self.readfile_fruits):
  279.             self.dico_fruits[i] = (self.readfile_images_fruits[i].strip(), self.readfile_fruits[i].strip()) # clé = int, valeur = tuple
  280.  
  281. # Création du menu déroulant:
  282.  
  283.         self.liste_object_fruits = [] # Liste qui stocke les objets correspondant aux pages de fruits
  284.         self.fruits_basic_func = Menu(self.tabs_list[3], bg = 'white', fg = 'green', bd = 2, relief = 'ridge', font = 'Times 14 italic')
  285.         self.fruits_basic_func.add_command(label = 'Rajouter un fruit', underline = 0, command = self.add_fruit) # La commande appelle la méthode add_fruit()
  286.         self.fruits_basic_func.add_command(label = 'Supprimer un fruit', underline = 0, command = self.remove_fruit) # La commande appelle la méthode remove_fruit()
  287.         for i, element in enumerate(self.dico_fruits): # Création des pages de fruits par instanciation de la classe Fruits
  288.             self.object_fruits = Fruits(i, self.dico_fruits[i], "varietes_" + self.dico_fruits[i][1].lower(), "notes_" + self.dico_fruits[i][1].lower())
  289.             self.liste_object_fruits.append(self.object_fruits.fruits)
  290.             self.fruits_basic_func.add_command(label = self.dico_fruits[i][1], underline = 0, command = self.liste_object_fruits[i])
  291.         self.tabs_list[3].configure(menu = self.fruits_basic_func)
  292.  
  293. #- Méthode-----------------------------------------------------------------------------
  294.        
  295.     def add_fruit(self):
  296.         "Méthode qui ouvre une fenêtre pop-up pour rajouter un nouveau fruit dans le menu déroulant."
  297.         self.rajout = Toplevel()
  298.         self.rajout.title("Rajouter un fruit")
  299.         self.rajout_label = Label(self.rajout, text = "Veuillez entrer le nom du nouveau fruit", font = "Times 14", pady = 5)
  300.         self.rajout_label.grid(row = 0, padx = 10)
  301.         self.champ_rajout = Entry(self.rajout, width = 30, font = "Times 14")
  302.         self.champ_rajout.grid(row = 1, padx = 10, pady = 10)
  303.         self.champ_rajout.bind('<Return>', self.save_new_fruit) # Appel de la méthode d'enregistrement du nouveau fruit.
  304.  
  305. #- Méthode-----------------------------------------------------------------------------
  306.  
  307.     def save_new_fruit(self, event):
  308.         """Méthode qui enregistre un nouveau fruit dans le menu déroulant et qui créé
  309.           la page associée."""
  310.         self.new_fruit = self.champ_rajout.get().capitalize() # Récupération du nom du nouveau fruit et ajout d'une majuscule au début du nom.
  311.         self.rajout.iconify() # Iconification de la fenêtre Toplevel
  312.         with open("fruits", 'r') as self.file_fruits:
  313.             self.readfile_fruits = self.file_fruits.readlines()
  314.         if self.new_fruit + "\n" in self.readfile_fruits: # Si le fruit est déjà présent dans la liste, ouverture d'une fenêtre d'avertissement:
  315.             tkinter.messagebox.showwarning("Fruit déjà enregistré", "Ce fruit est déjà enregistré.")
  316.         else:
  317.             with open("fruits", 'a') as self.file_fruits:
  318.                 self.file_fruits.write(self.new_fruit + "\n") # Rajout du nom du nouveau fruit dans le fichier "fruits"
  319.             self.new_file_fruit = open("varietes_" + self.champ_rajout.get().lower(), 'a') # Création d'un fichier "variétés du fruit" en mode "append".
  320.             self.new_file_fruit.close()
  321.             self.new_file_notes_fruit = open("notes_" + self.champ_rajout.get().lower(), 'a') # Création d'un fichier "notes concernant le fruit" en mode "append"
  322.             self.new_file_notes_fruit.close()
  323.             with open('images_fruits', 'a') as self.file_image :
  324.                 self.file_image.write("/images/default_image.png\n") # Attribution de l'image par défaut pour illustrer la nouvelle page "fruits".
  325.             self.show_list_fruits()
  326.             self.import_picture = tkinter.messagebox.askquestion("Importer une image", "Le nouveau fruit vient d'être rajouté. Souhaitez-vous importer une image pour illustrer la page " + self.new_fruit + "?", icon = "question")
  327.             if self.import_picture == "yes" : # Réponse positive à la question précédente
  328.                 self.choose_picture = tkinter.filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','.*')])
  329.                 self.basename = os.path.basename(self.choose_picture) # Retourne le dernier élément d'un chemin
  330.                 shutil.copy(self.choose_picture, "images/images_importees") # Copie de l'image importée dans le dossier passé en deuxième argument.
  331.                 with open("images_fruits", 'r') as self.file_images_fruits:
  332.                     self.readfile_images_fruits = self.file_images_fruits.readlines()
  333.                     self.readfile_images_fruits = self.readfile_images_fruits[:-1] # Suppression de l'image par défaut
  334.                     self.readfile_images_fruits.append('/images/images_importees/' + self.basename + '\n') # Ajout de la nouvelle image
  335.                 with open("images_fruits", 'w') as self.file_images_fruits :
  336.                     for i, element in enumerate(self.readfile_images_fruits):
  337.                         self.file_images_fruits.write(self.readfile_images_fruits[i]) # Réécriture du contenu du fichier "images_fruits"
  338.         self.show_list_fruits() # Appel de la méthode show_list_fruits()
  339.  
  340. #- Méthode-----------------------------------------------------------------------------        
  341.            
  342.     def remove_fruit(self):
  343.         "Méthode qui supprime un fruit"
  344.         self.remove = Toplevel()
  345.         self.remove.title("Supprimer un fruit")
  346.         self.remove_label = Label(self.remove, text = "Entrez le nom du fruit à supprimer", font = "Times 14", pady = 5)
  347.         self.remove_label.grid(row = 0, padx = 10)
  348.         self.champ_remove = Entry(self.remove, width = 30, font = "Times 14")
  349.         self.champ_remove.grid(row = 1, padx = 10, pady = 10)
  350.         self.champ_remove.bind('<Return>', self.fruit_to_remove) # Appel de la méthode de suppression du nouveau fruit.
  351.  
  352. #- Méthode-----------------------------------------------------------------------------
  353.        
  354.     def fruit_to_remove(self, event):
  355.         "Méthode qui supprime un fruit."
  356.         self.remove_fruit = self.champ_remove.get() # Récupération du nom du fruit à supprimer.
  357.         self.remove.iconify() # Iconification de la fenêtre Toplevel()
  358.         self.confirmation_suppression = tkinter.messagebox.askokcancel("Supprimer ce fruit?", "Voulez-vous vraiment supprimer ce fruit?\nCette opération est irréversible et détruira toutes les données enregistrées.") # Message d'avertissement avant destruction définitive.
  359.         with open("fruits", 'r') as self.file_fruits:
  360.             self.readfile_fruits = self.file_fruits.readlines()
  361.         for i, element in enumerate (self.readfile_fruits):
  362.             if self.remove_fruit.lower() == self.readfile_fruits[i].lower().strip():
  363.                 self.readfile_fruits.remove(self.readfile_fruits[i]) # Suppression du fruit
  364.                 with open("fruits", 'w') as self.file_fruits: # Ouverture en mode "write" (= Effacement des données contenues dans le fichier.)
  365.                     for i2, element in enumerate(self.readfile_fruits):
  366.                         self.file_fruits.write(self.readfile_fruits[i2]) # Réécriture du fichier
  367.             with open("images_fruits", 'r') as self.file_images_fruits: # Ouverture en mode lecture et stockage des données du fichier dans la variable (de type liste) suivante:
  368.                 self.readfile_images_fruits = self.file_images_fruits.readlines()
  369.             if self.readfile_images_fruits[i] != "/images/default_image.png\n": # Suppression du chemin de l'image du fruit si ce chemin est différent de l'image par défaut.
  370.                 self.to_remove = self.readfile_images_fruits[i] # Stockage dans une variable avant suppression
  371.                 self.readfile_images_fruits.remove(self.readfile_images_fruits[i]) # Suppression dans la liste
  372.         if self.to_remove not in self.readfile_images_fruits:
  373.             os.remove(self.directory + self.to_remove.strip()) # Suppression de l'image dans le répertoire si celle-ci n'est pas utilisée pour un autre fruit (par erreur ou étourderie).
  374.         with open("images_fruits", 'w') as self.file_images_fruits : # Réécriture du fichier
  375.             for i, element in enumerate(self.readfile_images_fruits):
  376.                 self.file_images_fruits.write(self.readfile_images_fruits[i])
  377.         for i in os.listdir(self.directory): # retourne la liste des fichiers ou dossiers présent dans le répertoire passé en argument
  378.             if i.startswith("varietes_" + self.remove_fruit.lower()): # Suppression du fichier "varietes_xxxx" contenant le nom du fruit sans majuscule (.lower())
  379.                 os.remove(i)
  380.         if self.directory + "/notes_" + self.remove_fruit.lower():
  381.             os.remove(self.directory + "/notes_" + self.remove_fruit.lower()) # Suppression du fichier "notes_xxxx" contenant le nom du fruit sans majuscule.
  382.         self.champ_remove.delete(0, 30) # Effacement du contenu du champ d'entrée
  383.         self.show_list_fruits() # Appel de la méthode show_list_fruits()
  384.  
  385. # ============MAIN PROGRAMM ================================================== :
  386.  
  387. if __name__ == "__main__":  # Partie du code qui s'exécute si le programme est lancé de manière autonome
  388.  
  389.     home = Home() # Création de l'objet home par instanciation de la classe Home
  390.     home.home() # Appel de la méthode home (classe Home) sur l'objet home.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement