Advertisement
Kaadem-85

ordinotes.py

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