Advertisement
Kaadem-85

agenda.py

Mar 31st, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 22.01 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. #==== IMPORTATION DES MODULES =============================================================================
  19.  
  20. from tkinter import* # Importation du module tkinter
  21. from tkinter.messagebox import *
  22. from calendar import monthcalendar # Instancie un calendrier mensuel
  23. from calendar import Calendar # Instancie un calendrier annuel
  24. from time import localtime # Importation de la date et de l'heure locales
  25. from datetime import time, datetime # Module permettant de manipuler les dates et les durées.
  26. from os import chdir        # Importation du module OS pour effectuer le changement de répertoire
  27. import os
  28. import os.path
  29. from PIL import Image, ImageTk  # Module PIL (traitement des images importées)
  30. from contextlib import suppress # Module qui permet d'ignorer une exception
  31.  
  32.  
  33.                
  34. #==== CLASSE ==============================================================================================
  35.  
  36. class Agenda(object) :
  37.     "Instanciation de l'agenda"
  38.    
  39.     dico_iteration = {}
  40.    
  41.     def __init__(self, d, m, y) :
  42.         "Constructeur"     
  43.         self.d = d
  44.         self.m = m
  45.         self.y =
  46.  
  47. #----------------------------------------------------------------------------------------------------------
  48.  
  49.     def pages(self, destroy_date = int()) :
  50.         "Création des pages"
  51.         self.directory = os.getcwd()
  52.         print(self.directory)
  53.        
  54.         if destroy_date != int() : # Destruction éventuelle de la page précédemment consultée
  55.             destroy_date.destroy()
  56.         self.page = Tk()
  57.         self.page.title('Mon agenda')
  58.        
  59. #----------------------------------------------------------------------------------------------------------
  60.  
  61.         self.frame = Frame(self.page, bg='white')
  62.         self.frame.grid()
  63.    
  64. #----------------------------------------------------------------------------------------------------------
  65.  
  66.         self.buttons = Frame(self.frame, bg='white')
  67.         self.buttons.grid(row=0, column=0, sticky = 'w')
  68.  
  69. #----------------------------------------------------------------------------------------------------------
  70.    
  71.         # Widget Frame qui contient la date du jour et deux petits triangles de changement de date :
  72.         self.subframe = Frame(self.frame, bg='white', relief='groove', bd=1, padx= 170)
  73.         self.subframe.grid(row=1, column=0, columnspan=2, sticky = 'nsew')
  74.    
  75. #----------------------------------------------------------------------------------------------------------
  76.    
  77.         #Création de trois boutons d'en-tête. Les commandes sont configurées plus tard :
  78.         self.button_list = list()
  79.         self.textes = ['Enregistrer', 'Valider', 'Effacer']
  80.         for i in range(0, len(self.textes)):
  81.             self.button = Button(self.buttons, text = self.textes[i], bg='#357AB7', fg='white', activebackground='white', activeforeground='#357AB7')
  82.             self.button.grid(row=0, column=i)
  83.             self.button_list.append(self.button)
  84.  
  85.         # Création de l'onglet "rechercher" :
  86.         self.search_labelframe = LabelFrame(self.buttons, bd=1, highlightthickness=0, bg='white')
  87.         self.search_labelframe.grid(row=0, column = 4)
  88.  
  89.         # Importation de l'image de la loupe :
  90.         self.mon_image = self.directory + "/images/loupe.png" # Importation de l'image
  91.         self.image = Image.open(self.mon_image)
  92.         self.size = 32, 32 # Réduction de la taille de l'image
  93.         self.image.thumbnail(self.size)
  94.         self.photo = ImageTk.PhotoImage(self.image, master = self.page)
  95.  
  96.         # Fonction qui efface le mot "Rechercher" lorsque l'utilisateur clique dans le widget "Entry"
  97.         def delete(event):
  98.             if self.search_entry.get() == "Rechercher":
  99.                 self.search_entry.delete(0, 'end')
  100.  
  101.         # Création du widget "chercher":
  102.         self.search_entry = Entry(self.search_labelframe, fg='#357AB7', font='Times 12 bold', border=0, highlightthickness=0)
  103.         self.search_entry.grid(row=0, column=0)
  104.         self.search_entry.insert(0, "Rechercher")
  105.         self.search_entry.bind('<Button-1>', delete)
  106.         self.search_entry.bind('<Return>', lambda event : self.find.search(self.search_entry))
  107.  
  108.         # Création du bouton "loupe" :
  109.         self.find = Actions(self.d, self.m, self.y)
  110.         self.search = Button(self.search_labelframe, image=self.photo, bd=0, highlightthickness=0, command = lambda : self.find.search(self.search_entry))
  111.         self.search.grid(row=0, column=1)
  112.  
  113.  #----------------------------------------------------------------------------------------------------------
  114.        
  115.         # Création du triangle de changement de date (vers le futur):
  116.         self.next_day = Actions(int(self.d)+1, self.m, self.y) # Création de l'objet "Jour d'après" :
  117.         self.right_triangle=Button(self.subframe,bg='white',fg='#357AB7',text=u"\u25B6",bd=0,highlightthickness=0,padx=0,pady=0,activebackground='#357AB7',activeforeground='white')
  118.         self.right_triangle.grid(row = 0, column = 2, padx = 10, sticky = 'e')
  119.         self.right_triangle['command'] = lambda : self.next_day.next_day(self.page)
  120. #----------------------------------------------------------------------------------------------------------
  121.  
  122.         # Date sous la forme dd/mm/yyyy.
  123.         # Quatre possibilités différentes concernant l'adjonction d'un "0" supplémentaire :
  124.         if int(self.d) < 10 and self.m < 10 :
  125.             self.date = Label(self.subframe, bg = 'white', fg='#357AB7', bd=0, font = 'Times 18 bold',
  126.             text = '0' + str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  127.         elif int(self.d) < 10 :
  128.             self.date = Label(self.subframe, bg = 'white', fg='#357AB7', bd=0, font = 'Times 18 bold',
  129.             text = '0' + str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  130.         elif self.m < 10 :
  131.             self.date = Label(self.subframe, bg = 'white', fg='#357AB7', bd=0, font = 'Times 18 bold',
  132.             text = str(self.d) + '/' + '0' + str(self.m) + '/' + str(self.y))
  133.         else :
  134.             self.date = Label(self.subframe, bg = 'white', fg='#357AB7', bd=0, font = 'Times 18 bold', text = str(self.d) + '/' + str(self.m) + '/' + str(self.y))
  135.         self.date.grid(row = 0, column = 1, sticky = 'nsew')
  136.  
  137. #----------------------------------------------------------------------------------------------------------
  138.  
  139.         # Création du triangle de changement de date (vers le passé):
  140.         self.previous_day = Actions(int(self.d)-1, self.m, self.y) # Création de l'objet "Jour d'avant" :
  141.         self.left_triangle=Button(self.subframe, bg='white', fg='#357AB7', text=u"\u25C0", bd=0, highlightthickness=0, padx = 0, pady = 0, activebackground = '#357AB7', activeforeground = 'white')
  142.         self.left_triangle.grid(row = 0, column = 0, padx = 10, sticky = 'w')
  143.         self.left_triangle['command'] = lambda : self.previous_day.previous_day(self.page)
  144.    
  145. #----------------------------------------------------------------------------------------------------------
  146.  
  147.         # Jour en cours. Remplacement des slashes par des tirets bas :
  148.         self.current_date = self.date['text'].replace('/', '_')
  149.  
  150. #----------------------------------------------------------------------------------------------------------
  151.  
  152.         # Création des pages de l'agenda
  153.         self.subframe2_list = list() # Création de deux listes vides.
  154.         self.hour_list = []
  155.         for i in range(7,22): # pour chaque heure de la journée :
  156.             self.subframe2 = Frame(self.frame, bg='white') # Création d'un cadre
  157.             self.subframe2.grid(row=i-5, column=0, sticky='nsew')
  158.             self.subframe2_list.append(self.subframe2)
  159.             if i < 10 : # Création des étiquettes affichant les heures de la journée.
  160.                 self.label = Label(self.subframe2, fg = 'white', bg = '#357AB7', padx=5, pady=2,font = 'bold', text = '  ' + str(i) + u"\u2070\u2070")
  161.             else :
  162.                 self.label = Label(self.subframe2, fg = 'white', bg = '#357AB7', padx=5, pady=2,font = 'bold', text = str(i) + u"\u2070\u2070")
  163.             self.label.grid(row=0, column = 0, sticky='nsew')  
  164.             # Création des entrées pour chaque heure de la journée :
  165.             self.hour = Text(self.subframe2, bg ='white', fg = 'black', font ='Times 14', highlightthickness=0, bd=1, selectbackground='blue', selectforeground='white', wrap='word', width=50, height=1, padx=10, pady=2)
  166.             self.hour.grid(row=0, column=1, sticky='nsew')
  167.             self.hour_list.append(self.hour)
  168.  
  169.         self.action_affichage = Actions(self.d, self.m, self.y, self.current_date, self.hour_list)
  170.         self.action_affichage.entries(self.page) # Affichage les différentes entrées de la page appelée.
  171.        
  172.         self.save = Actions(self.d, self.m, self.y, self.current_date)
  173.         self.validation = Actions(self.d, self.m, self.y, self.current_date)
  174.         self.invalider = Actions(self.d, self.m, self.y, self.current_date)
  175.         self.erase = Actions(self.d, self.m, self.y, self.current_date)
  176.         self.button_list[0]['command'] = lambda : self.save.save(self.subframe2_list)
  177.         self.button_list[1]['command'] = lambda : self.validation.validation(self.subframe2_list, self.page)
  178.         self.button_list[2]['command'] = lambda : self.erase.erase(self.subframe2_list, self.page)
  179.    
  180.         # Message qui apparait sous la forme d'une fenêtre pop-up dans le cas où une entrée n'a pas été traitée ni validée. Le message contient la date et le texte de l'entrée :
  181.         self.validated = open('validated','r')
  182.         self.read_validated = self.validated.readlines()
  183.         self.validated.close()
  184.         for i in range (0, len(self.read_validated)):
  185.             self.read_validated[i] = self.read_validated[i][:-1]
  186.         self.filelist = open('entrylist', 'r')
  187.         self.readfilelist = self.filelist.readline()
  188.         self.filelist.close()
  189.         self.readfilelist = self.readfilelist.split(',')
  190.         self.readfilelist = self.readfilelist[:-1]
  191.         for i in range(0, len(self.readfilelist)) :
  192.             self.readfilelist[i] = self.readfilelist[i].replace("entrees_agenda/", "")
  193.             if self.readfilelist[i] not in Agenda.dico_iteration :
  194.                 Agenda.dico_iteration[self.readfilelist[i]] = 0
  195.                 index = Agenda.dico_iteration[self.readfilelist[i]]
  196.             else:
  197.                 Agenda.dico_iteration[self.readfilelist[i]] = 1
  198.                 index = Agenda.dico_iteration[self.readfilelist[i]]
  199.             self.readfilelist[i] = self.readfilelist[i].split('-')
  200.             for i2 in range(0, len(self.readfilelist[i])):
  201.                 self.readfilelist[i][i2] = self.readfilelist[i][i2].split('_')
  202.             if self.readfilelist[i][0] == '':
  203.                 self.readfilelist[i][0] = []
  204.             self.duration = datetime.now() - datetime(int(self.readfilelist[i][0][2]), int(self.readfilelist[i][0][1]), int(self.readfilelist[i][0][0]))
  205.             self.readfilelist[i][0] = '_'.join(self.readfilelist[i][0])
  206.             self.readfilelist[i][1] = ''.join(self.readfilelist[i][1])
  207.             self.readfilelist[i] = '-'.join(self.readfilelist[i])
  208.             self.readfilelist[i] = "entrees_agenda/" + self.readfilelist[i]
  209.             if self.duration.days > 1 and self.readfilelist[i] not in self.read_validated :
  210.                 while index < 1 :
  211.                     self.file = open(self.readfilelist[i], 'r')
  212.                     self.readfile = self.file.readline()
  213.                     self.readfilelist[i] = self.readfilelist[i].replace("_", "/")
  214.                     self.readfilelist[i] = self.readfilelist[i][:-2]
  215.                     self.warning = showwarning(self.readfilelist[i].replace("entrees/agenda/", ""), self.readfilelist[i].replace("entrees/agenda/", "") + '\n' + self.readfile)
  216.                     index += 1
  217.                     Agenda.dico_iteration[self.readfilelist[i]] = 1
  218.  
  219.         # Démarrage du réceptionnaire d'événements :
  220.         self.page.mainloop()
  221.                                
  222. #==== CLASSE ==============================================================================================    
  223.  
  224. class Actions(Agenda) :
  225.     "Actions enregister, effacer, valider..."
  226.    
  227.     def __init__(self, d, m, y, current_date = [], hour_list = []) :
  228.         "Constructeur"
  229.         Agenda.__init__(self, d, m, y)
  230.         self.current_date = current_date
  231.         self.hour_list = hour_list
  232.        
  233.         self.directory = os.getcwd()
  234. #----------------------------------------------------------------------------------------------------------
  235.                        
  236.     def previous_day(self, page) :
  237.         "Conditions à remplir pour reculer d'un jour"
  238.         if self.d < 1 :
  239.             self.m -=1
  240.             if self.m == 0 :
  241.                 self.m = 12
  242.                 self.y -= 1
  243.             self.c = monthcalendar(self.y, self.m)
  244.             self.d = max(max(self.c))# "max(max" s'explique par le fait que self.c est une liste de listes.
  245.         self.pages(page)
  246.  
  247. #----------------------------------------------------------------------------------------------------------
  248.        
  249.     def next_day(self, page) :
  250.         "Conditions à remplir pour avancer d'un jour"
  251.         self.c = monthcalendar(self.y, self.m) # Mois en cours.
  252.         if self.d > max(max(self.c)): # Si le n° du jour est supérieur au n° du dernier jour du mois
  253.             self.d = '1' # N° du jour = 1
  254.             self.m += 1
  255.             if self.m > 12 :
  256.                 self.m = 1  # m = mois
  257.                 self.y += 1 # y = year(année)
  258.         self.pages(page)
  259.  
  260. #----------------------------------------------------------------------------------------------------------
  261.  
  262.     def save(self, subframe2_list):
  263.         "Enregistrement des entrées"
  264.         self.subframe2_list = subframe2_list
  265.         self.file = None
  266.         for i in range(0, len(self.subframe2_list)) :
  267.             for child in self.subframe2_list[i].winfo_children():
  268.                 if child.winfo_class() == "Text":
  269.                     self.get_text = child.get(1.0, 'end')
  270.                     self.filename = "entrees_agenda/" + str(self.current_date) + '-' + str(i)
  271.                     if len(self.get_text) > 1 :
  272.                         self.file = open(self.filename, 'w')
  273.                         self.file.write(self.get_text)
  274.                         self.file.close()
  275.                         self.filelist = open('entrylist', 'r')
  276.                         self.readfilelist = self.filelist.readline()
  277.                         self.filelist.close()
  278.                         self.readfilelist = self.readfilelist.strip() + self.filename + ','
  279.                         self.readfilelist.replace('\n','')
  280.                         self.filelist = open('entrylist', 'w')
  281.                         self.filelist.write(self.readfilelist)
  282.                         self.filelist.close()
  283.                         self.readfilelist = self.readfilelist.split(',')
  284.                         self.readfilelist2 = []
  285.                         for entry in self.readfilelist :
  286.                             if entry not in self.readfilelist2 :
  287.                                 self.readfilelist2.append(entry)
  288.                             if entry == '' :
  289.                                 del entry
  290.                         self.readfilelist2 = ",".join(self.readfilelist2)
  291.                         self.filelist = open('entrylist', 'w')
  292.                         self.filelist.write(self.readfilelist2)
  293.                         self.filelist.close()
  294.                 if child['bg'] == 'green' and child['fg'] == 'white' :
  295.                     self.green(i, self.filename)
  296.  
  297. #----------------------------------------------------------------------------------------------------------
  298.  
  299.     def entries(self, page) :
  300.         "Affichage des entrées de la page consultée"
  301.         self.page = page
  302.         self.filelist = open('entrylist', 'r')
  303.         self.readfilelist = self.filelist.readline()
  304.         self.readfilelist = self.readfilelist.split(',')
  305.         for i in range(0, len(self.readfilelist)):
  306.             self.readfilelist[i] = self.readfilelist[i].replace("entres_agenda/", "")
  307.         for i in range(0, len(self.readfilelist)):
  308.             self.readfilelist[i] = self.readfilelist[i].split('-')
  309.         self.readfilelist = self.readfilelist[:-1]
  310.         self.filelist.close()
  311.         for i in range (0, len(self.readfilelist)) :
  312.             self.filename = "entrees_agenda/" + str(self.current_date) + '-' + self.readfilelist[i][1]
  313.             if '-'.join(self.readfilelist[i]) == self.filename :
  314.                 self.file = open(self.filename, 'r')
  315.                 self.readfile = self.file.readline()
  316.                 self.hour_list[int(self.readfilelist[i][1])].delete(1.0, 'end')
  317.                 self.readfile = self.readfile.strip()
  318.                 self.hour_list[int(self.readfilelist[i][1])].insert('end', self.readfile)
  319.                 self.file.close()
  320.         self.validated = open('validated', 'r')
  321.         self.read_validated = self.validated.readlines()
  322.         self.validated.close()
  323.         for i in range(0, len(self.read_validated)):
  324.             self.read_validated[i] = self.read_validated[i].replace("entres_agenda/", "")
  325.         self.read_validated_2 = []
  326.         for entry in self.read_validated :
  327.             if entry not in self.read_validated_2 :
  328.                 self.read_validated_2.append(entry)
  329.         self.validated = open('validated', 'w')
  330.         for i in range (0, len(self.read_validated_2)):
  331.             self.validated.write(self.read_validated_2[i])
  332.         self.validated.close()
  333.         for i in range(0, len(self.read_validated_2)):
  334.             self.read_validated_2[i] = self.read_validated_2[i].split('-')
  335.             print(self.read_validated_2[i])
  336.             if self.read_validated_2[i][0].replace("entrees_agenda/","") == self.current_date :
  337.                 self.hour_list[int(self.read_validated_2[i][1].strip())].config(bg = 'green', fg = 'white')
  338.                
  339. #----------------------------------------------------------------------------------------------------------    
  340.  
  341.     def validation(self, subframe2_list, page):
  342.         "Validation des entrées traitées (Rendez-vous honorés etc...)"
  343.         self.page = page
  344.         self.subframe2_list = subframe2_list
  345.         self.validated_entry = self.page.focus_get()
  346.         self.validated_entry.config(bg = 'green', fg = 'white')
  347.         self.save(self.subframe2_list)
  348.                        
  349. #----------------------------------------------------------------------------------------------------------    
  350.  
  351.     def green(self, i, filename) :
  352.         "Stockage des pages validées dans un fichier"
  353.         self.filename = filename
  354.         self.validated = open('validated', 'a')
  355.         self.validated.write(self.filename + '\n')
  356.         self.validated.close()
  357.    
  358. #----------------------------------------------------------------------------------------------------------
  359.    
  360.     def erase(self, subframe2_list, page):
  361.         "Effacement des entrées"
  362.         self.page = page
  363.         self.subframe2_list = subframe2_list
  364.         self.get_entry = self.page.focus_get()
  365.         self.get_entry.delete(1.0, 'end')
  366.         self.get_entry.config(bg='white', fg='black')
  367.         self.filename = ''
  368.         for i  in range(0, len(self.subframe2_list)) :
  369.             for child in self.subframe2_list[i].winfo_children():
  370.                 if child == self.get_entry:
  371.                     self.filename = "entrees_agenda/" + str(self.current_date) + '-' + str(i)
  372.         self.validated = open('validated', 'r')
  373.         self.read_validated = self.validated.readlines()
  374.         self.validated.close()
  375.         if self.filename + '\n' in self.read_validated :
  376.             self.read_validated.remove(self.filename + '\n')
  377.         self.validated = open('validated', 'w')
  378.         for i in range(0, len(self.read_validated)):
  379.             self.validated.write(self.read_validated[i])
  380.         self.validated.close()
  381.         self.filelist = open('entrylist', 'r')
  382.         self.readfilelist = self.filelist.readline()
  383.         self.readfilelist = self.readfilelist.split(',')
  384.         if self.filename in self.readfilelist :
  385.             self.readfilelist.remove(self.filename)
  386.         self.readfilelist = ','.join(self.readfilelist)
  387.         self.filelist.close()
  388.         self.filelist = open('entrylist', 'w')
  389.         self.filelist.write(self.readfilelist)
  390.         self.filelist.close()
  391.         print(self.directory + self.filename)
  392.         os.remove(self.directory + "/" + self.filename)
  393.  
  394. #----------------------------------------------------------------------------------------------------------
  395.    
  396.     def search(self, search_entry):
  397.         "Méthode qui cherche une chaîne de caractères dans les fichiers"
  398.         #with suppress(Exception): # suppress permet d'ignorer une exception, en l'occurrence un problème d'encodage utf-8 qui ne gène en rien l'exécution du programme.
  399.         self.search_string = search_entry.get()
  400.         self.search_string = self.search_string.lower() # Toutes les majuscules sont transformées en minuscule
  401.         print(self.directory)
  402.         self.listdir = os.listdir(self.directory + "/entrees_agenda/") # Liste de tous les fichiers contenus dans la chaîne de caractères passée en argument
  403.         print(self.listdir)
  404.         self.list_all_files = list()
  405.         for i in range (0, len(self.listdir)) :
  406.             self.list_all_files.append(self.listdir[i]) # Liste de tous les fichiers stockant les entrées contenues dans les pages de l'agenda.
  407.         self.in_page = Toplevel(bg = 'white', padx=10, pady=10)
  408.         self.in_page.title('Votre recherche')
  409.         self.label = Label(self.in_page, bg = 'white', text = 'Les pages suivantes'+'\n'+'contiennent votre recherche', fg = 'black', font='Times 18 bold')
  410.         self.label.grid(row=0, column = 0, columnspan = 4, pady = 10)
  411.         i2 = 1 # variable d'incrémentation de la ligne dans le Toplevel
  412.         i3 = 0 # variable d'incrémentation de la colonne dans le Toplevel
  413.         for i in range(0, len(self.list_all_files)):
  414.             self.file = open("entrees_agenda/" + self.list_all_files[i], 'r')
  415.             self.readfile = self.file.readline()
  416.             self.readfile = self.readfile.lower() # Toutes les majuscules sont transformées en minuscule
  417.             self.file.close()
  418.             if self.readfile.find(self.search_string) != -1 : # On cherche si l'occurrence recherchée se trouve dans le fichier ouvert.
  419.                 self.filename = os.path.splitext(self.list_all_files[i])
  420.                 self.d = int(self.filename[0][:2]) # Jour du fichier ouvert
  421.                 self.m = int(self.filename[0][3:5]) # Mois du fichier ouvert
  422.                 self.y = int(self.filename[0][6:10]) # Année du fichier ouvert
  423.                 # Création du bouton ouvrant la page ou se trouve l'occurrence :
  424.                 self.button_page = Button(self.in_page, bg='#357AB7', fg='white', text=self.filename[0][:10].replace('_','/'))
  425.                 self.button_page.grid(row=i2, column = i3, sticky = 'w')
  426.                 self.show_page = Agenda(self.d, self.m, self.y) # Création de l'objet self.show_page
  427.                 self.show_page.pages # Appel de la méthode pages de la classe Agenda
  428.                 self.button_page.config(command=self.show_page.pages) # Liaison du bouton à la méthode pages.
  429.                 i3 += 1 # Incrémentation de la colonne
  430.                 if i3 % 4 == 0:
  431.                     i2 += 1 # Incrémentation de la ligne lorsque le modulo 4 de la colonne est égal à 0.
  432.                     i3 = 0  # Réinitialisation de la colonne à 0 lorsqu'une nouvelle ligne commence.
  433.         if len(self.in_page.winfo_children()) == 1 : # Si le Toplevel ne contient aucun bouton, cela signifie qu'aucune page ne contient l'occurrence recherchée.
  434.             self.label.config(bg='red', fg='white', text='Aucun résultat', padx = 50) # Message sur fond rouge : "Aucun résultat"
  435.            
  436. # ##### MAIN PROGRAMM #####################################################################################
  437.  
  438. if __name__ == "__main__":
  439.  
  440.     rep = os.getcwd()
  441.     d = localtime()[2] # Current day
  442.     m = localtime()[1] # Current month
  443.     y = localtime()[0] # Current year
  444.  
  445.     agenda = Agenda(d, m, y)
  446.     agenda.pages()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement