Advertisement
Kaadem-85

legume.py

Mar 31st, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 35.13 KB | None | 0 0
  1. #!/usr/bin/python3
  2. # -*- coding: utf8 -*-
  3.  
  4. # Copyright © 2016 Benoît Boudaud <https://twitter.com/Ordinosor>
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program.  If not, see <http://www.gnu.org/licenses/>
  17.  
  18. #==== IMPORTATION DES MODULES ================================
  19.  
  20. from tkinter import*    # importation du module Tkinter
  21. import tkinter.filedialog # Importation du sous-module filedialog nécessaire pour utiliser askopenfilename()
  22. import tkinter.messagebox
  23. import os # Importation du module os (actions liées au système d'exploitation)
  24. from PIL import Image, ImageTk  # Module PIL (traitement des images importées)
  25. import shutil # module servant à copier-coller des fichiers
  26. from datetime import datetime
  27.  
  28. ##############################################################
  29. #  TO-DO LIST :                                              #
  30. #                                                            #
  31. # - Inclure l'année                                          #
  32. # - Empêcher redimensionnement des fenêtres                  #
  33. #                                                            #
  34. ##############################################################
  35.  
  36. #==== CLASSES ================================================
  37.  
  38. class Legumes(object):
  39.     "Instanciation de la page des légumes"
  40.  
  41. #---- Méthode ------------------------------------------------
  42.  
  43.     def __init__(self, image_legume, vegetable_title, file_varietes, file_notes):
  44.         "Méthode constructeur"
  45.         # Retourne le répertoire courant sous la forme d'une chaîne de caractères:
  46.         self.directory = os.getcwd()  
  47.         self.image_legume = image_legume    
  48.         self.vegetable_title = vegetable_title
  49.         self.file_varietes = file_varietes
  50.         self.file_notes = file_notes
  51.         # Variables gérant l'apparition des fenêtres pop-up (fenêtres d'information):
  52.         #self.i3 = 0
  53.         self.i4 = 0
  54.         self.i8 = 0
  55.        
  56. #---- Méthode ------------------------------------------------
  57.        
  58.     def legumes(self):
  59.         "Création de la page légumes"            
  60.         self.fenetre_principale = Tk()
  61.         self.fenetre_principale.title("Légumes")
  62.         self.main_frame = Frame(self.fenetre_principale, height = 700, width = 1100, bg= 'white', relief = 'ridge', bd = 0, padx = 10, pady = 10)
  63.         self.main_frame.grid()
  64.         self.main_frame.grid_propagate(0)
  65.        
  66.         # Importation et traitement des images:
  67.        
  68.         self.icones = ["/images/enregistrer.png", "/images/corbeille.png"]
  69.         self.icones_open = [Image.open(self.directory + i) for i in self.icones]
  70.         self.icones_size = (64, 64)
  71.         self.icones_size2 = (32, 32)  
  72.         [i.thumbnail(self.icones_size) for i in self.icones_open]
  73.         self.photos_icones = [ImageTk.PhotoImage(i, master = self.fenetre_principale) for i in self.icones_open]
  74.  
  75.         self.label_donnees = LabelFrame(self.main_frame, bd = 0, bg = "white", highlightthickness = 0)
  76.         self.label_donnees.grid(row = 0, column = 3, sticky = 'nswe', padx = 10, pady = 3)
  77.         self.icones_open[1].thumbnail(self.icones_size2)
  78.         self.photo_icone_save_file = ImageTk.PhotoImage(self.icones_open[1], master = self.fenetre_principale)
  79.         self.button_save_file = Button(self.label_donnees, bg ='white', bd = 1, image = self.photo_icone_save_file, command = self.info_destroy_file)
  80.         self.button_save_file.grid(row = 0, column = 0, sticky = 'nswe')
  81.         self.titre_donnees = Label(self.label_donnees, text = "Données enregistrées", bd = 0, bg = 'green', fg = 'white', relief = 'ridge', font = "Times 16 bold", highlightthickness = 0, padx = 187)
  82.         self.titre_donnees.grid(row = 0, column = 1, sticky = 'nswe')
  83.        
  84.         # Création du widget "Données enregistrées" (pour chaque variété de légumes:
  85.  
  86.         self.editeur_defil = Scrollbar(self.fenetre_principale, bg = "green", relief='ridge', width=18,  orient = 'vertical', cursor ='hand2', troughcolor = 'white', activebackground = 'green')
  87.         self.editeur_defil.grid(row = 0,column = 1, rowspan = 2, sticky = 'ns')
  88.         self.editeur = Text(self.main_frame, height = 24, width = 52, bg = 'white', highlightbackground = "grey", bd = 2, relief = 'flat', font = 'Times 16', padx = 11, pady = 8, wrap = 'word', yscrollcommand =  self.editeur_defil.set)
  89.         self.editeur.grid(row = 0, column = 3, rowspan = 2,padx = 10, pady = 5, sticky = 'swe')
  90.         self.editeur_defil.config(command = self.editeur.yview)
  91.        
  92.         # Création du widget "Observations":
  93.        
  94.         self.notes_defil = Scrollbar(self.main_frame, bg = "green", relief = 'ridge', width = 18,  orient = 'vertical', cursor = 'hand2', troughcolor = 'white', activebackground = 'green')
  95.         self.notes_defil.grid(row = 1,column = 2, sticky = 'nsw', pady = 10)
  96.         self.notes = Text(self.main_frame, height = 8, width = 39, bg='white', highlightbackground = "grey", bd = 2, relief = 'flat', font='Times 16', padx=11, pady=8, wrap='word', yscrollcommand =  self.notes_defil.set)
  97.         self.notes.grid(row = 1, column = 0, columnspan = 2, pady = 10, sticky = 'nsew')
  98.         self.notes_defil.config(command = self.notes.yview)
  99.         self.notes.insert(1.0, "Observations\n")
  100.         self.notes.tag_add('titel', '1.0', '1.20')
  101.         self.notes.tag_config('titel', foreground = "green", justify='center', underline = 1, font='Times 16 bold')
  102.        
  103.         # Affichage des notes et observations de la variété de légume sélectionnée:
  104.        
  105.         with open(self.file_notes, 'r') as self.file :
  106.             self.readfile_notes = self.file.readlines()
  107.         [self.notes.insert('end', self.readfile_notes[i]) for i, element in enumerate(self.readfile_notes)]
  108.        
  109.         # Importation et traitement de l'image illustrant le bouton d'enregistrement du widget "Notes":
  110.        
  111.         self.icones_open[0].thumbnail(self.icones_size2)
  112.         self.photo_icone_save_note = ImageTk.PhotoImage(self.icones_open[0], master = self.fenetre_principale)
  113.         self.button_save_note = Button(self.main_frame, bg ='white', bd = 1, image = self.photo_icone_save_note, command = self.save_notes)
  114.         self.button_save_note.grid(row = 1, column = 0, rowspan = 2, padx = 5, pady = 15, sticky = 'nw')
  115.        
  116.         self.method_widgets() # Appel de méthode
  117.        
  118.     #---- Méthode ------------------------------------------------
  119.  
  120.     def method_widgets(self, image_legume = None):
  121.         "Création de la fenêtre contenant les champs d'entrée"
  122.         # Destruction éventuelle de la fenêtre précédente :
  123.        
  124.         for child in self.main_frame.winfo_children():
  125.             if child.winfo_class() == "Canvas":
  126.                 child.destroy()
  127.         if image_legume != None:
  128.             self.image_legume = image_legume
  129.    
  130.         # Traitement de l'image illustrant le légume:
  131.        
  132.         self.image_open = Image.open(self.directory + self.image_legume)
  133.         self.image_size = (96, 96)
  134.         self.image_open.thumbnail(self.image_size)
  135.         self.photo_legume = ImageTk.PhotoImage(self.image_open, master = self.fenetre_principale)
  136.        
  137.         # Création de la fenêtre contenant les champs d'entrée:
  138.        
  139.         self.widgets = Canvas(self.main_frame, height = 500, width = 800, bg = 'white', bd = 2, relief = 'ridge', highlightthickness = 0)
  140.         self.widgets.grid(row = 0, column = 0, columnspan = 3, sticky = 'ns', pady = 3)
  141.         self.picture_button = Button(self.widgets, bg = 'white', bd = 0, image = self.photo_legume, command = self.agrandir_remplacer)
  142.         self.picture_button.grid(row = 0, column = 0, padx = 5, pady = 10)
  143.        
  144.         self.titre = Label(self.widgets, text = self.vegetable_title, bg = 'white', fg = "black", font = 'Times 20 bold', padx = 5, pady = 5)
  145.         self.titre.grid(row = 0,column = 1, columnspan = 2, sticky = 'n', padx = 5, pady = 5)
  146.         self.espece = Label(self.widgets, text = 'Variétés :', font = 'Times 16', bg = 'white')
  147.         self.espece.grid(row = 1, column = 0, sticky = 'ne', padx = 5, pady = 5)
  148.         self.listbox_varietes() # Appel de méthode
  149.        
  150.     #---- Méthode ------------------------------------------------
  151.                
  152.     def listbox_varietes(self) :
  153.         "Création de la Listbox affichant les variétés du légume"
  154.         for child in self.widgets.winfo_children():
  155.             if child.winfo_class() == "Listbox":
  156.                 child.destroy()
  157.         self.varietes = []      
  158.         with open(self.file_varietes,'r') as self.file:
  159.             self.readfile_varietes = self.file.readlines()
  160.             [self.varietes.append(self.readfile_varietes[i].replace("\n", "")) for i in range (0, len(self.readfile_varietes))] # Compréhension de liste
  161.        
  162.         self.listlegume = StringVar()
  163.         self.y_defil_liste = Scrollbar(self.widgets, bg = "green", relief='ridge', width= 14, orient='vertical', cursor='hand2', troughcolor = 'white', activebackground = 'green')
  164.         self.y_defil_liste.grid(row = 1, column = 2, sticky='nsw', pady = 6)
  165.        
  166.         self.liste = Listbox(self.widgets, listvariable = self.listlegume, activestyle = 'dotbox', bd = 1, bg = 'white', font = 'Times 16', selectmode = 'browse', width = 20, height = 5, selectbackground = 'green', selectforeground = 'white', selectborderwidth = 1, yscrollcommand = self.y_defil_liste.set)
  167.         self.liste.grid(row = 1, column = 1, sticky = 'nsew', pady = 5)
  168.         self.y_defil_liste.config(command = self.liste.yview)
  169.  
  170.         self.liste_legumes = []
  171.         self.liste_legumes.append(" Rajouter une variété")
  172.         self.liste_legumes.append(" Supprimer une variété")
  173.         [self.liste_legumes.append(self.varietes[i]) for i, element in enumerate(self.varietes)]
  174.  
  175.         for i in range(0, len(self.liste_legumes)) :
  176.             self.liste.insert(i, self.liste_legumes[i])
  177.             self.liste.bind('<Return>', self.choice)
  178.             self.listlegume.set(self.liste_legumes)
  179.             self.listlegume.get()
  180.         self.liste.itemconfig(self.liste_legumes.index(" Rajouter une variété"), selectbackground = "green", selectforeground = "white", foreground = "green")
  181.         self.liste.itemconfig(self.liste_legumes.index(" Supprimer une variété"), selectbackground = "red", selectforeground = "white", foreground = "red")
  182.                
  183.         # Instanciation des entrées :
  184.        
  185.         self.date_weight = LabelFrame(self.widgets, bg = 'white')
  186.         self.date_weight.grid(row = 2, column = 0, columnspan = 3, padx = 30, pady = 10)
  187.  
  188.         self.date = Label(self.date_weight, text = 'Date de récolte :', font = 'Times 16', bg = 'white')
  189.         self.date.grid(row = 0, column = 0, sticky = 'e', padx = 5, pady = 5)
  190.        
  191.         self.entree_date = Entry(self.date_weight, width = 15, font = 'Times 16', bd = 2, bg = '#EFEFEF', relief = 'ridge', state = 'disabled', takefocus = 0)
  192.         self.entree_date.grid(row = 0, column = 1, sticky = 'w', padx = 5, pady = 5)
  193.  
  194.         self.weight = Label(self.date_weight, text = 'Poids (en Kg) :', font = 'Times 16', bg = 'white')
  195.         self.weight.grid(row = 1, column = 0, sticky = 'e', padx = 5, pady = 5)
  196.        
  197.         self.entry_weight = Entry(self.date_weight, width = 15, font = 'Times 16', state = 'disabled', bd = 2, bg = '#EFEFEF', relief = 'ridge', takefocus = 0)
  198.         self.entry_weight.grid(row = 1, column = 1, sticky = 'w', padx = 5, pady = 5)
  199.  
  200.         self.total_weight = Label(self.date_weight, text = 'Total (en Kg) :', font = 'Times 16', bg = 'white')
  201.         self.total_weight.grid(row = 2, column = 0, sticky = 'w', padx = 5, pady = 5)
  202.        
  203.         self.entry_weight_total = Entry(self.date_weight, width = 15, font = 'Times 16', state = 'disabled', bd = 2, bg = '#EFEFEF', relief = 'ridge', takefocus = 0)
  204.         self.entry_weight_total.grid(row = 2, column = 1, sticky = 'w', padx = 5, pady = 5)    
  205.                
  206.         # Fenêtre pop-up
  207.        
  208.         self.selection = tkinter.messagebox.showinfo("Votre sélection", 'Faites votre choix dans la liste déroulante et pressez la touche "Entrée".')
  209.         self.chosen = self.liste.curselection()
  210.  
  211.     #---- Méthode ------------------------------------------------
  212.  
  213.     def choice(self, event = None):
  214.         "Méthode qui sélectionne une variété"  
  215.         self.chosen = self.liste.curselection()
  216.         if self.chosen == (0,):
  217.             self.rajout = Toplevel()
  218.             self.rajout.title("Rajouter une variété")
  219.             self.champ_rajout = Entry(self.rajout, width = 35, bg = 'green', fg = 'white', font = "Times 16")
  220.             self.champ_rajout.grid()
  221.             self.champ_rajout.insert(0, "  Entrez le nom de la variété à rajouter.")
  222.             self.rajout.after(1500, self.videEntreeRajout)
  223.             self.champ_rajout.bind('<Return>', self.save_new_variety)
  224.         elif self.chosen == (1,):
  225.             self.suppression = Toplevel()
  226.             self.suppression.title("Supprimer une variété")
  227.             self.champ_suppression = Entry(self.suppression, width = 35, bg = 'red', fg = 'white', font = "Times 16")
  228.             self.champ_suppression.grid()
  229.             self.champ_suppression.insert(0, "  Entrez le nom de la variété à supprimer.")
  230.             self.suppression.after(1500, self.videEntreeSuppression)
  231.             self.champ_suppression.bind('<Return>', self.suppress_variety)
  232.         elif self.chosen != (0,) and self.chosen != (1,) :
  233.             self.editeur.delete(1.0, 'end')
  234.             self.affichage() # Appel de méthode
  235.  
  236.     #---- Méthode ------------------------------------------------
  237.  
  238.     def affichage(self, event = None) :
  239.         "Affichage des données de la variété sélectionnée"
  240.         while self.i8 < 1 :
  241.             self.message1 = tkinter.messagebox.showinfo('Date et poids', 'Entrez la date de récolte et le poids. Puis cliquez sur le bouton d\'enregistrement ou pressez la touche "Entrée".')
  242.             self.i8 += 1
  243.         with open(self.file_varietes, 'r') as self.file:
  244.             self.readfile = self.file.readlines()
  245.         for i in range(0, len(self.readfile)) :
  246.             if self.chosen == (i + 2,) :
  247.                 self.entree_date.focus_set()
  248.                 self.entree_date.delete(0, 15)
  249.                 self.entree_date.config(bg = 'white', fg = 'black')
  250.                 self.entry_weight_total.delete(0, 15)
  251.                 self.today = datetime.now()
  252.                 self.jour_actuel = str(self.today.day) + "/" + str(self.today.month) + "/" + str(self.today.year)
  253.                 self.entree_date.config(state = 'normal')
  254.                 self.file_variete = open(self.file_varietes + "_" + str(i + 1), 'a')
  255.                 self.file_variete.close()
  256.                 with open(self.file_varietes + "_" + str(i + 1), 'r') as self.file_variete:
  257.                     self.readfile_variete = self.file_variete.readlines()
  258.                 self.total_weight_variete = open(self.file_varietes + "_" + str(i + 1) + '_PT', 'a')
  259.                 self.total_weight_variete.close()
  260.                 with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'r') as self.total_weight_variete:
  261.                     self.readfile_PT = self.total_weight_variete.readline()
  262.                     self.entry_weight_total.configure(state = 'normal')
  263.                     self.entry_weight_total.insert(0, self.readfile_PT)
  264.                 self.list_edit = []
  265.                 for i2 in range (len(self.readfile_variete), 0, -2):
  266.                     self.edit = Label(self.editeur, width = 55, justify = 'left', bg = '#EFEFEF', text = str(self.readfile_variete[i2-2]) + str(self.readfile_variete[i2-1]).strip(), highlightthickness = 2, highlightcolor = "red",  highlightbackground = "green", font = "Times 14", anchor = 'w', padx = 10, pady = 10, takefocus = 1)
  267.                     self.editeur.window_create('end', window=self.edit, padx=10, pady=10)
  268.                     self.object_edit = Label_Bind(self.entry_weight_total, self.chosen, self.edit, self.image_legume, self.vegetable_title, self.file_varietes, self.file_notes)
  269.                     self.list_edit.append(self.object_edit)
  270.                 for i3 in range(0, len(self.list_edit)):
  271.                     self.list_edit[i3].label_bind()
  272.                     # self.edit.insert('end', str(self.readfile_variete[i2-2]) + str(self.readfile_variete[i2-1]) + '\n')      
  273.                 #while self.i3 < 1 :
  274.                 self.entree_date.insert(0, self.jour_actuel)
  275.                 #self.i3+=1
  276.                 self.entree_date.bind('<Return>', self.entree_poids)
  277.                 #self.entree_date.bind('<Tab>', self.entree_poids)
  278.                
  279.     #---- Méthode ------------------------------------------------
  280.  
  281.     def entree_poids(self, event) :
  282.         "Méthode qui enregistre la date (provisoirement)"
  283.         self.editeur.delete(1.0, 'end')
  284.         self.entry_weight.config(state='normal')
  285.         self.tentative_date = self.entree_date.get()
  286.         if len(self.tentative_date) < 7:
  287.             self.signaleErreurDate()        
  288.         else:
  289.             try:
  290.                 self.verif2 = int(self.tentative_date[-4:len(self.tentative_date)])
  291.             except:
  292.                 self.signaleErreurDate()
  293.             else:
  294.                 self.entree_date.delete(0, 30)
  295.                 self.entree_date.insert(0, 'Enregistré')
  296.                 self.entry_weight.focus_set()
  297.                 while self.i4 < 1 :
  298.                     self.entry_weight.configure(bg = 'green', fg='white')
  299.                     self.entry_weight.insert(0, 'Exemple : 2.5')
  300.                     self.widgets.after(1500, self.videEntreePoids)
  301.                     self.i4 += 1
  302.                 self.entry_weight.bind('<Return>', self.date_poids_recolte)
  303.                 self.editeur.insert('end', "- " + self.tentative_date + "\n")
  304.                 self.entree_date.config(bg = "green", fg = "white")
  305.  
  306.     #---- Méthode ------------------------------------------------
  307.  
  308.     def date_poids_recolte(self, event):
  309.         "Méthode qui enregistre la date et le poids récolté"
  310.         self.tentative_poids = self.entry_weight.get()
  311.         try:
  312.             self.tentative_poids = str(round(float(self.tentative_poids), 2))
  313.         except:
  314.             self.signaleErreurPoids()
  315.         else:  
  316.             self.editeur.insert('end', '- ' + str(self.tentative_poids) + ' Kg\n')
  317.             self.entry_weight.delete(0, 30)
  318.             self.entry_weight.configure(bg = 'green', fg = 'white')
  319.             self.entry_weight.insert(0, 'Enregistré')
  320.             self.widgets.after(1000, self.videEntreePoids)
  321.             self.entree_date.delete(0, 30)
  322.             self.entree_date.config(bg = 'white', fg = 'black')
  323.             self.entree_date.insert(0, self.jour_actuel)
  324.             self.liste.focus_force()
  325.             self.choice()
  326.             with open(self.file_varietes, 'r') as self.file:
  327.                 self.readfile = self.file.readlines()
  328.             for i in range(0, len(self.readfile)) :
  329.                 if self.chosen == (i + 2,) :
  330.                     with open(self.file_varietes + "_" + str(i + 1), 'a') as self.file_variete:
  331.                         self.file_variete.write("- Date de récolte: " + self.tentative_date + "\n")
  332.                         self.file_variete.write('- Poids (en Kg): ' + str(self.tentative_poids) + '\n')
  333.                     self.total_weight_variete = open(self.file_varietes + "_" + str(i + 1) + '_PT', 'a')
  334.                     self.total_weight_variete.close()
  335.                     with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'r') as self.total_weight_variete:
  336.                         self.readfile_PT = self.total_weight_variete.readline()
  337.                         if self.readfile_PT == '':
  338.                             self.readfile_PT = 0
  339.                         with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'w') as self.total_weight_variete:
  340.                             self.total_weight_variete.write(str(float(self.readfile_PT) + float(self.tentative_poids)))
  341.                         with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'r') as self.total_weight_variete:
  342.                             self.readfile_PT = self.total_weight_variete.readline()
  343.                             self.entry_weight_total.delete(0, 15)
  344.                             self.entry_weight_total.configure(state = 'normal')
  345.                             self.entry_weight_total.insert(0, self.readfile_PT)
  346.                     with open(self.file_varietes + "_" + str(i + 1), 'r') as self.file_variete:
  347.                         self.readfile_variete = self.file_variete.readlines()
  348.                     self.editeur.delete(1.0, 'end')
  349.                     self.list_edit = []
  350.                     for i2 in range (len(self.readfile_variete), 0, -2):
  351.                         self.edit = Label(self.editeur, width = 55, justify = 'left', bg = '#EFEFEF', text = str(self.readfile_variete[i2-2]) + str(self.readfile_variete[i2-1]).strip(), highlightthickness = 2, highlightcolor = "red", highlightbackground = "green", font = "Times 14", anchor = 'w', padx = 10, pady = 10)
  352.                         self.editeur.window_create('end', window=self.edit, padx=10, pady=10)
  353.                         self.object_edit = Label_Bind(self.entry_weight_total, self.chosen, self.edit, self.image_legume, self.vegetable_title, self.file_varietes, self.file_notes)
  354.                         self.list_edit.append(self.object_edit)
  355.                     for i3 in range(0, len(self.list_edit)):
  356.                         self.list_edit[i3].label_bind()
  357.                             #self.edit.insert('end', str(self.readfile_variete[i2-2]) + str(self.readfile_variete[i2-1]) + '\n')
  358.            
  359.     #---- Méthode ------------------------------------------------
  360.    
  361.     def save_file(self):
  362.         "Enregistrement des changements dans les données de la variété sélectionnée."
  363.         self.new_file = self.editeur.get(1.0, 'end')
  364.         with open(self.file_varietes, 'r') as self.file:
  365.             self.readfile = self.file.readlines()
  366.         for i in range(0, len(self.readfile)) :
  367.             if self.chosen == (i + 2,) :
  368.                 with open(self.file_varietes + "_" + str(i + 1), 'w') as self.file_variete:
  369.                     self.file_variete.write(self.new_file)
  370.    
  371.     #---- Méthode ------------------------------------------------
  372.  
  373.     def save_new_variety(self, event):
  374.         "Enregistrement d'une nouvelle variété de légumes"
  375.         self.new_variety = self.champ_rajout.get()
  376.         self.rajout.destroy()
  377.         with open(self.file_varietes, 'a') as self.file:
  378.             self.file.write(" " + self.new_variety.capitalize() + "\n")
  379.         with open(self.file_varietes, 'r') as self.file:
  380.             self.readfile = self.file.readlines()
  381.         self.file_variete = open(self.file_varietes + "_" + str(len(self.readfile)), 'a')
  382.         self.file_variete.close()
  383.         self.total_weight_variete = open(self.file_varietes + "_" + str(len(self.readfile)) + '_PT', 'a')
  384.         self.total_weight_variete.write('0')
  385.         self.total_weight_variete.close()
  386.         self.listbox_varietes()
  387.  
  388.     #---- Méthode ------------------------------------------------
  389.        
  390.     def suppress_variety(self, event):
  391.         "Suppression d'une variété de légumes"
  392.         self.confirmation_suppression = tkinter.messagebox.askokcancel("Supprimer?", "Voulez-vous vraiment supprimer cette variété?\nCette opération est irréversible et détruira toutes les données enregistrées.")
  393.         if self.confirmation_suppression == True:
  394.             self.old_variety = self.champ_suppression.get().lower()
  395.             self.suppression.destroy()
  396.             print(self.old_variety)
  397.             with open(self.file_varietes, 'r') as self.file:
  398.                 self.readfile_varietes = self.file.readlines()
  399.                 print(self.readfile_varietes)
  400.             for i in range(0, len(self.readfile_varietes)) :
  401.                 if self.old_variety == self.readfile_varietes[i].strip() :
  402.                     try:
  403.                         os.remove(self.directory + "/" + self.file_varietes + "_" + str(i + 1))
  404.                     except:
  405.                         self.file_variete = open(self.file_varietes + "_" + str(i + 1), 'a')
  406.                     try:
  407.                        os.remove(self.directory + "/" + self.file_varietes + "_" + str(i + 1) + '_PT')
  408.                     except:
  409.                         self.total_weight_variete = open(self.file_varietes + "_" + str(i + 1) + '_PT', 'a')
  410.                 print(self.readfile_varietes[i].strip())
  411.                 print(self.old_variety)
  412.            
  413.             [self.readfile_varietes.remove(i) for i in self.readfile_varietes if " " + self.old_variety.capitalize() + "\n" == i]
  414.             with open(self.file_varietes, 'w') as self.file:
  415.                 [self.file.write(i) for i in self.readfile_varietes]
  416.             self.listbox_varietes()
  417.                        
  418.     #---- Méthode ------------------------------------------------
  419.  
  420.     def agrandir_remplacer(self):
  421.         "Agrandir ou pivoter la photo?"
  422.         self.image_resize = "/images/resize.png"
  423.         self.image4 = Image.open(self.directory + self.image_resize)
  424.         self.image4_size = 96, 96
  425.         self.image4.thumbnail(self.image4_size) # Redimensionnement de l'image
  426.         self.photo_resize = ImageTk.PhotoImage(self.image4)
  427.  
  428.         self.image_replace = "/images/default_image.png"
  429.         self.image5 = Image.open(self.directory + self.image_replace)
  430.         self.image5_size = 96, 96
  431.         self.image5.thumbnail(self.image5_size) # Redimensionnement de l'image
  432.         self.photo_rotate = ImageTk.PhotoImage(self.image5)
  433.        
  434.         self.choix = Toplevel(name = 'selected', bg  = 'white')
  435.         self.label_agrandir_remplacer = Label(self.choix, bg = 'white', fg = 'black', text = "Voulez-vous agrandir\nou remplacer la photo?", font = ('Times', '14', 'bold'))
  436.         self.label_agrandir_remplacer.grid(row = 0, column = 0, columnspan = 2, padx = 10, pady = 5)
  437.         self.agrandissement = Button(self.choix, image = self.photo_resize, bg = 'black', bd = 2, highlightthickness = 1, command = self.photo_agrandie)
  438.         self.agrandissement.grid(row = 1, column = 0, sticky = 'w', padx = 10, pady = 10)
  439.         self.replace_image = Button(self.choix, image = self.photo_rotate, bg = 'black', bd = 2, highlightthickness = 1, command = self.replace_photo)
  440.         self.replace_image.grid(row = 1, column = 1, sticky = 'w', padx = 10, pady = 10)
  441.  
  442.     #---- Méthode ------------------------------------------------
  443.        
  444.     def photo_agrandie(self) :
  445.         "Méthode permettant d'agrandir les photos"
  446.         self.grande_photo = Toplevel() #name = 'selected')
  447.         self.image_open2 = Image.open(self.directory + self.image_legume)
  448.         self.great_picture = ImageTk.PhotoImage(self.image_open2)
  449.         if self.image_open2.size[0] > 768 and self.image_open2.size[1] > 768:
  450.             self.image_legume_size = 1024, 1024
  451.             self.image_open2.thumbnail(self.image_legume_size)
  452.         self.great_picture = ImageTk.PhotoImage(self.image_open2)
  453.         self.label_photo = Label(self.grande_photo, image = self.great_picture)
  454.         self.label_photo.grid()
  455.  
  456.     #---- Méthode ------------------------------------------------
  457.  
  458.     def replace_photo(self):
  459.         "Remplacement de photos"
  460.         self.choose_picture = tkinter.filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','.*')])
  461.         self.basename = os.path.basename(self.choose_picture)
  462.         shutil.copy(self.choose_picture, "images/images_importees")
  463.         with open("images_legumes", 'r') as self.file_images_legumes:
  464.             self.readfile_images_legumes = self.file_images_legumes.readlines()
  465.             for i in self.readfile_images_legumes:
  466.                 if i == self.image_legume + "\n":
  467.                     self.loc = self.readfile_images_legumes.index(i)
  468.                     self.readfile_images_legumes.remove(i)
  469.                     if i != "/images/default_image.png\n":
  470.                         os.remove(self.directory + i.strip())
  471.                     self.readfile_images_legumes.insert(self.loc, "/images/images_importees/" + self.basename + "\n")
  472.         with open("images_legumes", 'w') as self.file_images_legumes :
  473.             [self.file_images_legumes.write(self.readfile_images_legumes[i]) for i, element in enumerate(self.readfile_images_legumes)]
  474.         self.info_modif = tkinter.messagebox.showinfo("Nouvelle photo", "La modification prendra effet au prochain redémarrage du programme.")
  475.  
  476.     #---- Méthode ------------------------------------------------
  477.    
  478.     def save_notes(self):
  479.         "Enregistrement des notes"
  480.         self.new_notes = self.notes.get(2.0, 'end')
  481.         with open(self.file_notes, 'w') as self.file :
  482.             self.file.write(self.new_notes)
  483.      
  484.     #---- Méthode ------------------------------------------------
  485.        
  486.     def info_destroy_file(self):
  487.         "Information sur la suppression d'une entrée"
  488.         print(self.chosen)
  489.         if self.chosen != () and self.chosen != (0,) and self.chosen != (1,):
  490.             self.warning = tkinter.messagebox.showinfo('Supprimer une entrée', "Cliquez sur l'entrée que vous souhaitez supprimer et confirmez la suppression.")
  491.  
  492. # METHODES DE GESTION DES ERREURS :
  493.        
  494.     def signaleErreurDate(self):
  495.         self.entree_date.configure(bg ='red', fg='white')
  496.         self.entree_date.delete(0,15)
  497.         self.entree_date.insert(0, 'Format invalide')
  498.         self.widgets.after(1000, self.videEntreeDate)
  499.        
  500.     #---- Méthode ------------------------------------------------
  501.  
  502.     def videEntreeDate(self):
  503.         self.entree_date.configure(bg ='white', fg='black')
  504.         self.entree_date.delete(0, 15)
  505.        
  506.     #---- Méthode ------------------------------------------------
  507.  
  508.     def signaleErreurPoids(self):
  509.         self.entry_weight.configure(bg ='red', fg='white')
  510.         self.entry_weight.delete(0,15)
  511.         self.entry_weight.insert(0, 'Format invalide')
  512.         self.widgets.after(1000, self.videEntreePoids)
  513.  
  514.     #---- Méthode ------------------------------------------------
  515.        
  516.     def videEntreePoids(self):
  517.         self.entry_weight.configure(bg ='white', fg='black')
  518.         self.entry_weight.delete(0, 15)
  519.  
  520.     #---- Méthode ------------------------------------------------
  521.        
  522.     def signaleErreurRecherche(self):
  523.         self.entree_recherche.configure(bg ='red', fg='white')
  524.         self.entree_recherche.delete(0,30)
  525.         self.entree_recherche.insert(0, 'Aucun résultat')
  526.         self.can.after(1000, self.videEntreeRecherche)
  527.  
  528.     #---- Méthode ------------------------------------------------
  529.        
  530.     def videEntreeRecherche(self):
  531.         self.entree_recherche.configure(bg ='white', fg='black')
  532.         self.entree_recherche.delete(0, 30)
  533.        
  534.     #---- Méthode ------------------------------------------------
  535.  
  536.     def videEntreeRajout(self):
  537.         self.champ_rajout.configure(bg = 'white', fg = 'black')
  538.         self.champ_rajout.delete(0, 45)
  539.         self.champ_rajout.focus_set()
  540.        
  541.     #---- Méthode ------------------------------------------------
  542.  
  543.     def videEntreeSuppression(self):
  544.         self.champ_suppression.configure(bg = 'white', fg = 'black')
  545.         self.champ_suppression.focus_set()
  546.         self.champ_suppression.delete(0, 45)
  547.        
  548. class Label_Bind(Legumes):
  549.  
  550.     def __init__(self, entry_weight_total,chosen, edit, image_legume, vegetable_title, file_varietes, file_notes):
  551.         "Constructeur"
  552.         Legumes.__init__(self, image_legume, vegetable_title, file_varietes, file_notes)
  553.         self.entry_weight_total = entry_weight_total
  554.         self.chosen = chosen
  555.         self.edit = edit
  556.  
  557.     #---- Méthode ------------------------------------------------
  558.    
  559.     def label_bind(self):
  560.         self.edit.bind('<Enter>', lambda event: self.select_label(self.edit))
  561.         self.edit.bind('<Leave>', lambda event: self.deselect_label(self.edit))
  562.        
  563.     def select_label(self, edit):
  564.         self.edit = edit
  565.         self.edit.configure(highlightbackground = "red")
  566.         self.edit.bind('<Button-1>', lambda event: self.destroy_file(self.edit))
  567.    
  568.     def deselect_label(self, edit):
  569.         self.edit = edit
  570.         self.edit.configure(highlightbackground = "green")
  571.  
  572.     def destroy_file(self, edit):
  573.         "Méthode de destruction de l'entrée sélectionnée"
  574.         self.edit = edit
  575.         self.edit.unbind('<Button-1>')
  576.         self.warning2 = tkinter.messagebox.askokcancel('Supprimer une entrée', "Voulez-vous vraiment supprimer cette entrée?")
  577.         if self.warning2 == True:
  578.             self.recup_text = self.edit['text']
  579.             self.poids_a_retrancher = float(self.recup_text[self.recup_text.index(":", 35) + 2:])
  580.             self.recup_text = self.recup_text.split('\n')
  581.         with open(self.file_varietes, 'r') as self.file:
  582.             self.readfile = self.file.readlines()
  583.         for i in range(0, len(self.readfile)) :
  584.             if self.chosen == (i + 2,) :
  585.                 with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'r') as self.total_weight_variete:
  586.                     self.readfile_PT = self.total_weight_variete.readline()
  587.                 with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'w') as self.total_weight_variete:
  588.                     self.total_weight_variete.write(str(float(self.readfile_PT) - self.poids_a_retrancher))
  589.                 with open(self.file_varietes + "_" + str(i + 1) + '_PT', 'r') as self.total_weight_variete:
  590.                     self.readfile_PT = self.total_weight_variete.readline()
  591.                     self.entry_weight_total.delete(0, 15)
  592.                     self.entry_weight_total.configure(state = 'normal')
  593.                     self.entry_weight_total.insert(0, self.readfile_PT)
  594.                 with open(self.file_varietes + "_" + str(i + 1), 'r') as self.file_variete:
  595.                     self.readfile_variete = self.file_variete.readlines()
  596.                 for i2 in range(0, len(self.recup_text)):
  597.                     self.recup_text[i2] = self.recup_text[i2] + '\n'
  598.                 for i2 in range(0, len(self.recup_text)):
  599.                     if i2 % 2 == 0 :
  600.                         for i3 in range(0, len(self.readfile_variete)):
  601.                             if i3 % 2 == 0 :
  602.                                if self.recup_text[i2] + self.recup_text[i2 + 1] == self.readfile_variete[i3] + self.readfile_variete[i3 + 1]:
  603.                                    self.readfile_variete[i3:i3 + 2] = []
  604.                                    break                
  605.                 with open(self.file_varietes + "_" + str(i + 1), 'w') as self.file_variete:
  606.                     for i in range(0, len(self.readfile_variete)):
  607.                         self.file_variete.write(self.readfile_variete[i])
  608.                 self.edit.destroy()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement