Kaadem-85

module_notes.py

Mar 31st, 2017
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.16 KB | None | 0 0
  1. #!/usr/bin/python3
  2. # -*- coding: utf8 -*-
  3.  
  4. # Copyright © 2016 Ordinosor <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. from tkinter import* # Importation du module tkinter
  19. import os # Fonctions basiques du système d'exploitation
  20. from PIL import Image, ImageTk  # Module PIL (traitement des images importées)
  21. import tkinter.messagebox # Importation de la fenêtre de dialogue showwarning
  22. from module_globs import Globales   # Module de redimensionnement
  23. from time import localtime # Date du jour
  24.  
  25. #============================================================================
  26.  
  27. class Notes(object):
  28.     "Instanciation d'une note"
  29.     info_iterator = 0 # Variable qui permet l'affichage du message d'avertissement une seule fois.
  30.     show_notes_iterator = 80
  31.        
  32. #----------------------------------------------------------------------------
  33.  
  34.     def __init__(self):
  35.         "constructeur"
  36.         self.y = localtime()[0] # Current year
  37.         self.m = localtime()[1] # Current month
  38.         self.d = localtime()[2] # Current day
  39.         self.numb_note = '' # Variable correspondant au numéro de note et nécessaire à la modification de cette dernière (Méthode self.change)
  40.  
  41. #----------------------------------------------------------------------------
  42.        
  43.     def notes(self, previous_note = None):
  44.         "Création de la note"
  45.         self.previous_note = previous_note
  46.         if self.previous_note != None: # Destruction d'une éventuelle note précédente.
  47.            self.previous_note.destroy()
  48.        
  49.         self.rep = os.getcwd() # Retourne le répertoire courant
  50.        
  51.         self.note = Tk()
  52.         self.note.title("Ordinotes")
  53.         self.note_frame = Frame(self.note, bg = 'yellow')
  54.         self.note_frame.grid()
  55.                
  56.         self.menu_image = "/images/menu_icon.png" # Image de la page principale
  57.         self.image = Image.open(self.rep + self.menu_image)
  58.         self.image_size = 32, 32
  59.         self.image.thumbnail(self.image_size) # Redimensionnement de l'image
  60.         self.photo = ImageTk.PhotoImage(self.image, master = self.note)
  61.        
  62.         self.date_objet = LabelFrame(self.note_frame, bg = "yellow", bd = 0, highlightthickness = 0 ) # Barre contenant le menu, la date et le champ d'entrée de l'objet.
  63.         self.date_objet.grid(row = 0, column = 0, sticky = 'nsew', pady = 10)
  64.            
  65.         self.menu_button = Menubutton(self.date_objet, image=self.photo) # Menu avec différentes commandes
  66.         self.menu_button.grid(row= 0, column = 0, padx = 5)
  67.         self.menu_func=Menu(self.menu_button, bg='black', fg='white', bd=2, relief='ridge', font= 'Times 14')
  68.         self.menu_func.add_command(label='Nouveau', underline = 0, command = lambda arg = self.note : self.notes(arg))
  69.         self.menu_func.add_command(label='Ouvrir', underline = 0, command = lambda arg = self.note : self.show(arg))
  70.         self.menu_func.add_command(label='Enregistrer', underline = 0, command = lambda arg = self.note : self.save(arg))
  71.         self.menu_func.add_command(label='Quitter', underline = 0, command = self.note.quit)
  72.         self.menu_button.configure(menu = self.menu_func)
  73.        
  74.         self.entry_date = Entry(self.date_objet, bg="yellow", font='Times 14 bold', width = 10, bd = 0, highlightthickness = 0) # Date de la note
  75.         self.entry_date.grid(row = 0, column = 1, padx = 10)
  76.        
  77.         if self.d < 10 and self.m < 10 : # Formatage de la date : rajout d'un zéro lorsque le jour et/ou le mois sont inférieurs à 10.
  78.             self.entry_date.insert(0, '0' + str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  79.         elif self.d < 10 :
  80.             self.entry_date.insert(0, '0' + str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  81.         elif self.m < 10 :
  82.             self.entry_date.insert(0, str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  83.         else :
  84.             self.entry_date.insert(0, str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  85.        
  86.         self.label_objet = Label(self.date_objet, text = "Objet : ", bg = "yellow", font = 'Times 14 bold', padx = 5)
  87.         self.label_objet.grid(row =0, column = 2)
  88.         self.entry_objet = Entry(self.date_objet, bg="white", font='Times 14', width = 33, bd = 1, disabledbackground = 'white', disabledforeground = 'black')
  89.         self.entry_objet.grid(row = 0, column = 3)
  90.         self.entry_objet.focus_set() # Le focus est dirigé vers le champ d'entrée de l'objet.
  91.         self.entry_objet.bind('<Return>', self.focus_editor)
  92.        
  93.         self.editor = Text(self.note_frame, bg = "yellow", state = "disabled", font='Times 14',  width = 60, height = 10, bd = 0, highlightthickness = 0, padx = 20, pady = 20)
  94.         self.editor.grid(row = 1, column = 0, pady = 5)
  95.        
  96.         if Notes.info_iterator < 1 :
  97.             self.warning_editor = tkinter.messagebox.showinfo('Objet', 'BIENVENUE DANS ORDINOTES.\n\nVeuillez renseigner le champ "Objet" et presser la touche "Entrée" avant de rédiger votre note.')    
  98.            
  99.         Notes.info_iterator += 1 # Incrémentation de la variable pour afficher le message précédent une seule fois.
  100.         self.note.mainloop() # Déclenchement du réceptionnaire d'événements
  101.  
  102. #----------------------------------------------------------------------------
  103.  
  104.     def focus_editor(self, event):
  105.         "Autorise l'écriture de la note après avoir renseigné l'objet"
  106.         if self.entry_objet.get() != '' and not self.entry_objet.get().isspace():
  107.             self.editor.config(state='normal')
  108.             self.editor.focus_set()
  109.        
  110. #----------------------------------------------------------------------------
  111.    
  112.     def save(self, note) :
  113.         "Enregistrement de la note"
  114.         self.note = note
  115.         for child in self.note.winfo_children() :
  116.             if child.winfo_class() == 'Toplevel' :
  117.                 child.iconify()      
  118.         #self.note.after(100, lambda arg = self.note : self.destroy_widget(arg)) # Destruction de la note.
  119.         self.note_number = open('note_number', 'a')
  120.         self.note_number.close()
  121.         with open('note_number', 'r') as self.note_number: # Attribution d'un n° à chaque note suivi d'une itération.
  122.             self.iterateur = self.note_number.readline()
  123.             if self.iterateur == "":
  124.                 self.iterateur = "0"
  125.             self.iterateur = int(self.iterateur) + 1
  126.  
  127.         with open('note_number', 'w') as self.note_number:
  128.             self.note_number.write(str(self.iterateur))
  129.         self.get_entry_date = self.entry_date.get().replace('/', '_') # Variable qui stocke la date du jour et quiremplace les ':' par des '_'.
  130.         self.get_editor = self.editor.get(1.0, 'end')
  131.         self.get_entry_objet = self.entry_objet.get()
  132.         if self.numb_note != '' : # Variable liée à la méthode self.change()
  133.             with open(self.get_entry_date  + 'a' + self.numb_note + 'bnote', 'w') as self.file :
  134.                 self.file.write(self.get_entry_objet + '\n\n')
  135.                 self.file.write(self.get_editor)
  136.             with open(self.get_entry_date  + 'a' + self.numb_note + 'bnote', 'r') as self.file :
  137.                 self.show_notes(self.get_entry_date  + 'a' + self.numb_note + 'bnote', self.note)
  138.             self.numb_note = ''
  139.         else :      
  140.             with open(self.get_entry_date  + 'a' + str(self.iterateur) + 'bnote', 'w') as self.file :
  141.                 self.file.write(self.get_entry_objet + '\n\n')
  142.                 self.file.write(self.get_editor)
  143.             #with open(self.get_entry_date  + 'a' + str(self.iterateur) + 'bnote', 'r') as self.file :
  144.              #   self.show_notes(self.get_entry_date  + 'a' + str(self.iterateur) + 'bnote', self.note)
  145.         self.editor['state'] = 'disabled' # Verrouillage de l'éditeur de texte (interdit en écriture)
  146.  
  147. #----------------------------------------------------------------------------
  148.          
  149.     def show(self, note):
  150.         "Récapitulatif des notes rédigées qui apparaissent sous forme de boutons)"
  151.         self.listdir = os.listdir(self.rep) # Liste de tous les fichiers contenus dans la chaîne de caractères passée en argument
  152.         self.list_all_files = list()
  153.         self.note = note
  154.         for i, element in enumerate (self.listdir):
  155.             self.string = os.path.splitext(self.listdir[i])[0]
  156.             if self.string.endswith('note'):
  157.                 self.list_all_files.append(self.listdir[i]) # Liste de toutes les notes.
  158.         print(self.listdir)
  159.    
  160.         self.summary = Toplevel(self.note, bg = 'white', padx=10, pady=10)
  161.         self.summary.title('Vos notes')
  162.         self.summary.lift(self.note)
  163.         # self.note.after(3000, lambda arg = self.summary : self.destroy_widget(arg)) # Icônification de la fenêtre Toplevel
  164.         self.label = Label(self.summary, bg = 'white', text = 'Votre bloc-notes contient ' + str(len(self.list_all_files)) + ' note.', fg = 'black', font='Times 18 bold')
  165.         if len(self.list_all_files) > 1 :
  166.             self.label['text'] = 'Votre bloc-notes contient ' + str(len(self.list_all_files)) + ' notes.'
  167.         elif len(self.list_all_files) == 0 :
  168.             self.label['text'] = 'Votre bloc-notes est vide.'
  169.         self.label.grid(row=0, column = 0, columnspan = 4, pady = 10)
  170.         self.i2 = 1 # variable d'incrémentation de la ligne dans le Toplevel
  171.         self.i3 = 0 # variable d'incrémentation de la colonne dans le Toplevel
  172.         for i in range(0, len(self.list_all_files)): # Création des boutons
  173.             self.button_note = Button(self.summary, bg='black', fg='white', font = 'Times 14 bold',\
  174.             text=self.list_all_files[i][0:10].replace('_','/') + '\n' + 'Note n°' + str(self.list_all_files.index(self.list_all_files[i]) + 1))
  175.             self.button_note.grid(row=self.i2, column = self.i3, sticky = 'w')
  176.             self.show_note = Notes() # Création de l'objet self.show_note
  177.             self.show_note.show_notes # Appel de la méthode show_notes de la classe Agenda
  178.             # Liaison du bouton à la méthode show_notes :
  179.             self.button_note.config(command = lambda arg1 = self.list_all_files[i], arg2 = self.note, arg3 = self.summary : self.show_note.show_notes(arg1, arg2, arg3))
  180.             self.i3 += 1 # Incrémentation de la colonne
  181.             if self.i3 % 4 == 0:
  182.                 self.i2 += 1 # Incrémentation de la ligne lorsque le modulo 4 de la colonne est égal à 0.
  183.                 self.i3 = 0  # Réinitialisation de la colonne à 0 lorsqu'une nouvelle ligne commence.
  184.  
  185. #----------------------------------------------------------------------------
  186.            
  187.     def show_notes(self, note_file, previous_note = None, summary = None):
  188.         "Affiche une note déjà écrite"
  189.  
  190.         self.rep = os.getcwd() # Retourne le répertoire courant
  191.         self.note_file = note_file
  192.         self.previous_note = previous_note
  193.        
  194.         for child in self.previous_note.winfo_children() :
  195.             if child.winfo_class() == 'Toplevel' :
  196.                 child.withdraw()
  197.        
  198.         self.note = Tk()
  199.         self.note.title("Ordinotes")
  200.         self.note.geometry('580x340+' + str(Notes.show_notes_iterator) + '+' + str(Notes.show_notes_iterator)) # Apparition de la note dans le coin supérieur gauche.
  201.         Notes.show_notes_iterator += 100 # Décalage de 100 par 100 pour la prochaine note qui sera affichée.
  202.         self.note_frame = Frame(self.note, bg = '#00FF00')
  203.         self.note_frame.grid()
  204.                
  205.         self.menu_image = "/images/menu_icon.png" # Image de la page principale
  206.         self.image = Image.open(self.rep + self.menu_image)
  207.         self.image_size = 32, 32
  208.         self.image.thumbnail(self.image_size) # Redimensionnement de l'image
  209.         self.photo = self._photo = ImageTk.PhotoImage(self.image, master = self.note)
  210.        
  211.         self.date_objet = LabelFrame(self.note_frame, bg = "#00FF00", bd = 0, highlightthickness = 0 ) # Barre contenant le menu, la date et le champ d'entrée de l'objet.
  212.         self.date_objet.grid(row = 0, column = 0, sticky = 'nsew', pady = 10)
  213.        
  214.        
  215.         self.menu_button = Menubutton(self.date_objet, image=self.photo) # Menu avec différentes commandes
  216.         self.menu_button.image = self.photo # On conserve la référence de l'image.
  217.         self.menu_button.grid(row= 0, column = 0, padx = 5)
  218.         self.menu_func=Menu(self.menu_button, bg='black', fg='white', bd=2, relief='ridge', font= 'Times 14')
  219.         self.menu_func.add_command(label='Nouveau', underline = 0, command = lambda arg = self.note : self.notes(arg))
  220.         self.menu_func.add_command(label='Ouvrir', underline = 0, command = self.show(self.note))
  221.         self.menu_func.add_command(label='Enregistrer', underline = 0, command = lambda arg = self.note : self.save(arg))
  222.         self.menu_func.add_command(label='Modifier', underline = 0, command = lambda arg = self.note_file : self.change(arg))
  223.         self.menu_func.add_command(label='Supprimer', underline = 0, command = lambda arg1 = self.note_file, arg2 = self.note : self.remove(arg1, arg2))
  224.         self.menu_func.add_command(label='Tout supprimer', underline = 0, command = lambda arg1 = self.note_file, arg2 = self.note : self.remove_all(arg1, arg2))
  225.         self.menu_func.add_command(label='Quitter', underline = 0, command = self.note.quit)
  226.         self.menu_button.configure(menu = self.menu_func)
  227.        
  228.         self.entry_date = Entry(self.date_objet, bg="#00FF00", font='Times 14 bold', width = 10, bd = 0, highlightthickness = 0) # Date de la note
  229.         self.entry_date.grid(row = 0, column = 1, padx = 10)
  230.        
  231.         if self.d < 10 and self.m < 10 : # Formatage de la date : rajout d'un zéro lorsque le jour et/ou le mois sont inférieurs à 10.
  232.             self.entry_date.insert(0, '0' + str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  233.         elif self.d < 10 :
  234.             self.entry_date.insert(0, '0' + str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  235.         elif self.m < 10 :
  236.             self.entry_date.insert(0, str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  237.         else :
  238.             self.entry_date.insert(0, str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  239.        
  240.         self.label_objet = Label(self.date_objet, text = "Objet : ", bg = "#00FF00", font = 'Times 14 bold', padx = 5)
  241.         self.label_objet.grid(row =0, column = 2)
  242.         self.entry_objet = Entry(self.date_objet, bg="white", font='Times 14', width = 33, bd = 1, disabledbackground = 'white', disabledforeground = 'black')
  243.         self.entry_objet.grid(row = 0, column = 3)
  244.         self.entry_objet.focus_set() # Le focus est dirigé vers le champ d'entrée de l'objet.
  245.         self.entry_objet.bind('<Return>', self.focus_editor)
  246.        
  247.         self.editor = Text(self.note_frame, bg = "#00FF00", font='Times 14',  width = 60, height = 10, bd = 0, highlightthickness = 0, padx = 20, pady = 20)
  248.         self.editor.grid(row = 1, column = 0, pady = 5)
  249.        
  250.         self.file = open(self.note_file, 'r')
  251.         self.readfile = self.file.readlines()
  252.         self.file.close()
  253.         self.entry_objet.insert(0, self.readfile[0].strip())
  254.         self.readfile[2:] = [self.readfile[2:][i].strip() for i, element in enumerate(self.readfile[2:])]
  255.         i2 = 1.0
  256.         for i, element in enumerate(self.readfile[2:]):
  257.             self.editor.insert(i2, self.readfile[2:][i] + '\n')
  258.             i2 += 1
  259.         self.editor['state'] = 'disabled'
  260.         self.entry_objet['state'] = 'disabled'
  261.        
  262. #----------------------------------------------------------------------------
  263.        
  264.     def change(self, note_file):
  265.         "Modification d'une note"
  266.         self.note_file = note_file
  267.         self.numb_note = self.note_file[self.note_file.index('a')+1:self.note_file.index('b')] # Variable qui stocke le n° de la note à modifier.
  268.         self.editor['state'] = 'normal' # Déverrouillage de ces deux widgets : écriture autorisée.
  269.         self.entry_objet['state'] = 'normal'      
  270.        
  271. #----------------------------------------------------------------------------
  272.  
  273.     def remove(self, note_file, note) :
  274.         "Suppression d'une note"
  275.         self.note_file = note_file
  276.         self.note = note
  277.         os.remove(self.rep + '/' + self.note_file)
  278.         self.notes(self.note)
  279.        
  280.        
  281.     def remove_all(self, note_file, note) :
  282.         "Suppression de toutes les notes"
  283.         self.listdir = os.listdir(self.rep) # Liste de tous les fichiers contenus dans la chaîne de caractères passée en argument
  284.         self.list_all_files = list()
  285.         self.note = note
  286.         for i, element in enumerate (self.listdir):
  287.             self.string = os.path.splitext(self.listdir[i])[0]
  288.             if self.string.endswith('note'):
  289.                 os.remove(self.rep + '/' + self.string)
  290.        
  291.     def destroy_widget(self, widget):
  292.         "Icônification des Toplevel ou destruction des autres fenêtres"
  293.         self.widget = widget
  294.         if self.widget.winfo_class() == 'Toplevel' :
  295.             self.widget.iconify()  
  296.         else :
  297.             self.widget.destroy()
  298. #============================================================================
  299.  
  300. # PROGRAMME PRINCIPAL:
  301.  
  302. """Instruction qui sert à déterminer si le module est lancé
  303.  en tant que programme autonome (auquel cas les instructions qui suivent doivent être exécutées),
  304.  ou au contraire utilisé comme une bibliothèque de classe importée ailleurs.
  305.  Dans ce cas, cette partie de code est sans effet."""
  306.      
  307. if __name__ == "__main__":
  308.  
  309.     note = Notes() # Création de l'objet note par instanciation de la classe Notes.
  310.     note.notes() # Appel de la méthode notes.
Advertisement
Add Comment
Please, Sign In to add comment