Advertisement
Kaadem-85

calendrier.py

Sep 1st, 2016
1,505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.42 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 calendar import monthcalendar # Module servant à instancier les mois du calendrier
  22. from time import localtime # Importation de la date et de l'heure locales
  23. from datetime import datetime # Module permettant de manipuler les dates et les durées.
  24. from agenda import Agenda # Module permettant d'ouvrir l'agenda
  25. import os
  26. from os import chdir
  27.  
  28. #==== CLASSE ==============================================================================================
  29.  
  30. class Calendrier(object) :
  31.     "Classe instanciant le calendrier"
  32.  
  33. #----------------------------------------------------------------------------------------------------------
  34.  
  35.     def __init__(self, mainframe):
  36.         "Constructeur"
  37.         self.mainframe = mainframe
  38.         self.y = localtime()[0] # Current year
  39.         self.m = localtime()[1] # Current month
  40.         self.d = localtime()[2] # Current day
  41.         self.c = monthcalendar(self.y, self.m) # Création de l'objet "calendrier mensuel en cours"
  42.         self.w = datetime(self.y, self.m, self.d)
  43.         self.w = self.w.isocalendar()[1] # Retourne un tuple avec l'année et le n° de semaine en cours
  44.  
  45.         self.months = ((1, 'Janvier'), (2, 'Février'), (3, 'Mars'), (4, 'Avril'), (5, 'Mai'), (6, 'Juin'),             (7, 'Juillet'), (8, 'Août'), (9, 'Septembre'), (10, 'Octobre'), (11, 'Novembre'), (12, 'Décembre'))
  46.  
  47.         self.days = ('S', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di')
  48.  
  49. #----------------------------------------------------------------------------------------------------------
  50.  
  51.     def calendrier(self) :
  52.         "Méthode de création du calendrier"
  53.  
  54.         # Création d'un widget Frame pour placer les widgets de la ligne 0 :
  55.         self.subframe = Frame(self.mainframe, bg='white')
  56.         self.subframe.grid()
  57.  
  58.         # Création d'un widget Frame pour placer tous les widgets Button et les noms de chaque jour :
  59.         self.subframe2 = Frame(self.mainframe, bg='white')
  60.         self.subframe2.grid(row=1)
  61.  
  62.         # Création du bouton en forme de triangle permettant d'afficher le mois précédent :
  63.         self.left_triangle1=Button(self.subframe, bg='white', fg='#357AB7', text=u"\u25C0",                             bd=0,highlightthickness=0, padx=0, pady=0, activebackground='#E4E4E4', command = self.prev_month)
  64.         self.left_triangle1.grid(row = 0, column = 0, padx = 10, sticky='w')
  65.  
  66.         # Création du widget Label qui affiche le mois :
  67.         for i in range(0, len(self.months)) :
  68.             for i2 in range(0, len(self.months[i])):
  69.                 if self.months[i][i2] == self.m :
  70.                     self.month=Label(self.subframe,  bg='white', text=self.months[i][i2+1], font='Times 14', padx=10,pady=10)
  71.                     self.month.grid(row = 0, column = 1, columnspan = 2, sticky = 'w')
  72.  
  73.         # Création du bouton en forme de triangle permettant d'afficher le mois suivant :
  74.         self.right_triangle1=Button(self.subframe,  bg='white', fg='#357AB7', text=u"\u25B6", bd=0,             highlightthickness=0, padx = 0, pady = 0, activebackground = '#E4E4E4', command = self.next_month)
  75.         self.right_triangle1.grid(row = 0, column = 3, padx = 10, sticky = 'w')
  76.    
  77.         # Création du bouton en forme de triangle permettant d'afficher l'année précédente :
  78.         self.left_triangle2=Button(self.subframe,  bg='white', fg='#357AB7', text=u"\u25C0", bd=0, highlightthickness=0,            padx=0, pady=0, activebackground = '#E4E4E4', command = self.prev_year)
  79.         self.left_triangle2.grid(row = 0, column = 4, padx = 10, sticky = 'e')
  80.  
  81.         # Création du widget Label qui affiche l'année :
  82.         self.year = Label(self.subframe,  bg='white', text = str(self.y), font = 'Times 14', padx=10, pady=10)
  83.         self.year.grid(row = 0, column = 5, columnspan = 2, sticky = 'e')
  84.  
  85.         # Création du bouton en forme de triangle permettant d'afficher l'année suivante :
  86.         self.right_triangle2=Button(self.subframe,  bg='white', fg='#357AB7', text=u"\u25B6", bd=0, highlightthickness=0,           padx=0, pady=0, activebackground='#E4E4E4', command = self.next_year)
  87.         self.right_triangle2.grid(row = 0, column = 7, padx = 10, sticky = 'e')
  88.  
  89.         # Création des widgets Label affichant les deux premières lettres de chaque jour de la semaine :
  90.         for i in range(0, len(self.days)):
  91.             self.day=Label(self.subframe2, bg='#357AB7', fg='white', text=self.days[i], padx=10, pady=10)
  92.             self.day.grid(row = 0, column = i, sticky = 'nsew')
  93.  
  94. #----------------------------------------------------------------------------------------------------------
  95.  
  96.     def buttons(self) :
  97.         "Création des boutons affichant les numéros de chaque jour du mois"
  98.         self.buttonlist = []
  99.         self.row_numb = 1 # numéro de ligne
  100.         self.col_numb = 1 # La colonne 0 est réservée pour les boutons affichants les numéros de semaine.
  101.         for child in self.subframe2.winfo_children() :
  102.             if child.winfo_class() == 'Button' :
  103.                 child.destroy() # Destruction des éventuels boutons déjà placés.
  104.         for i in range(0, len(self.c)) :
  105.             self.sub_buttonlist = []
  106.             for i2 in range(0, len(self.c[i])):
  107.                 if self.c[i][i2] == 0 : # Si le jour est absent , itération de la colonne.
  108.                     self.col_numb +=1
  109.                     if self.col_numb % 8 == 0 : # A la huitième colonne, itération de la ligne.
  110.                         self.row_numb += 1
  111.                         self.col_numb = 1 # Nouvelle ligne : Le numéro de colonne repasse à 1.
  112.                 else : # Création des jours proprement dits :
  113.                     self.button = Button(self.subframe2, text = str(self.c[i][i2]), relief='flat', bd=1, bg='white', padx = 10, pady = 10)
  114.                     self.button.grid(row = self.row_numb, column = self.col_numb, sticky ='nsew')
  115.                     self.sub_buttonlist.append(self.button)
  116.                     self.sub_buttonlist.append(str(self.c[i][i2]))
  117.                     self.buttonlist.append(self.sub_buttonlist)
  118.                     self.sub_buttonlist = []
  119.                     # Le bouton du jour courant est bleu :
  120.                     if self.c[i][i2] == self.d and self.m == localtime()[1] and self.y == localtime()[0] :
  121.                         self.button.configure(bg='#357AB7', fg='white')
  122.                         self.row_curweek = self.row_numb # Récupération de la rangée de la semaine en cours
  123.                     self.col_numb += 1
  124.                     if self.col_numb % 8 == 0 :
  125.                         self.row_numb += 1
  126.                         self.col_numb = 1
  127.                     self.last_row = self.row_numb # Valeur de la dernière ligne
  128.         # Appel de la méthode pages du module Agenda. 
  129.         for i in range(0, len(self.buttonlist)):
  130.             # Création de l'objet "agenda" et configuration de la commande de chaque bouton :
  131.             self.d = int(self.buttonlist[i][0]['text'])
  132.             self.agenda = Agenda(self.d, self.m, self.y)
  133.             self.buttonlist[i][0]['command'] = self.agenda.pages
  134.  
  135. #----------------------------------------------------------------------------------------------------------
  136.  
  137.     def current_week(self) :
  138.         "Affichage des n° de semaines du mois en cours"
  139.         i = self.row_curweek # Variables D'itération
  140.         self.curweek = datetime(self.y, self.m, self.d)
  141.         self.curweek = self.curweek.isocalendar()[1] # Retourne l'année et le n° de semaine en cours.
  142.         while i >= 1 : # Création des boutons avec les n° de semaine --> direction passé
  143.             self.week = Button(self.subframe2, bg='#357AB7',fg='white',text=str(self.curweek), padx=10, pady=10)
  144.             self.week.grid(row = i, column = 0, sticky = 'nsew')
  145.             self.curweek -= 1          
  146.             i -= 1
  147.  
  148.         i = self.row_curweek + 1
  149.         self.curweek = datetime(self.y, self.m, self.d)
  150.         self.curweek = self.curweek.isocalendar()[1] + 1 # Réinitialisation de la variable.
  151.         while i <= self.last_row : # Création des boutons avec les n° de semaine --> direction futur
  152.             self.week = Button(self.subframe2, bg='#357AB7',fg='white',text=str(self.curweek), padx=10, pady=10)
  153.             self.week.grid(row = i, column = 0, sticky = 'nsew')
  154.             self.curweek += 1          
  155.             i += 1
  156.  
  157. #----------------------------------------------------------------------------------------------------------
  158.  
  159.     def weeks(self) :
  160.         "Affichage des n° de semaine du mois précédent ou du mois suivant"
  161.         self.row = 1
  162.         for i in range(0, len(self.c)): # Boucle de 0 jusqu'au nombre de semaines dans le mois courant.
  163.             i2 = 0
  164.             while i2 < len(self.c[i]): # Boucle de 0 jusqu'au nombre de jours dans chaque semaine du mois.
  165.                 if self.c[i][i2] != 0  :
  166.                     self.curweek = datetime(self.y, self.m, self.c[i][i2])
  167.                     break # Interruption de la boucle si la valeur est != 0
  168.                 i2 += 1
  169.             self.curweek = self.curweek.isocalendar()[1] # Réinitialisation de la variable.
  170.             # Création des nouveaux boutons de semaines :
  171.             self.week = Button(self.subframe2, bg='#357AB7',fg='white',text=str(self.curweek), padx=10, pady=10)
  172.             self.week.grid(row = self.row, column = 0, sticky = 'nsew')
  173.             self.row +=1
  174.  
  175. #----------------------------------------------------------------------------------------------------------
  176.  
  177.     def prev_month(self) :
  178.         "Affiche le mois précédent"
  179.        
  180.         if self.m == 1 :
  181.             self.m = 12
  182.             self.y -= 1
  183.             self.month['text'] = self.months[11][1]
  184.             self.c = monthcalendar(self.y, 12)
  185.             self.year.configure(text = str(self.y))
  186.             self.buttons()
  187.             self.weeks()
  188.  
  189.         else :
  190.             self.m-=1
  191.             self.month['text'] = self.months[self.m-1][1]
  192.             self.c = monthcalendar(self.y, self.m)
  193.             self.buttons()
  194.             self.weeks()
  195.  
  196. #----------------------------------------------------------------------------------------------------------
  197.  
  198.     def next_month(self) :
  199.         "Affiche le mois suivant"
  200.        
  201.         if self.m == 12 :
  202.             self.m = 1
  203.             self.y += 1
  204.             self.month['text'] = self.months[0][1]
  205.             self.c = monthcalendar(self.y, self.m)
  206.             self.year.configure(text = str(self.y))
  207.             self.buttons()
  208.             self.weeks()
  209.  
  210.         else :
  211.             self.m += 1
  212.             self.month['text'] = self.months[self.m-1][1]
  213.             self.c = monthcalendar(self.y, self.m)
  214.             self.buttons()
  215.             self.weeks()
  216.  
  217. #----------------------------------------------------------------------------------------------------------
  218.  
  219.     def prev_year(self) :
  220.         "Recul d'une année dans le passé"
  221.         # Compréhension de liste. La méthode prev_month et activée 12 fois :
  222.         [self.prev_month() for i in range(12)]
  223.  
  224. #----------------------------------------------------------------------------------------------------------
  225.  
  226.     def next_year(self) :
  227.         "Projection d'une année dans le futur"
  228.         # Compréhension de liste. La méthode next_month et activée 12 fois :    
  229.         [self.next_month() for i in range(12)]
  230.    
  231. #=========== MAIN PROGRAMM ================================================================================
  232.  
  233. if __name__ == "__main__":
  234.  
  235.     rep = os.getcwd() # = /home/benoit
  236.     if rep != '/home/benoit' :
  237.         rep = '/home/benoit'
  238.     chdir(rep + "/Documents/agendrier") # Change directory, c'est-à dire changement du répertoire de travail courant.
  239.  
  240.     fenetre = Tk()
  241.     fenetre.title('Mon agendrier')
  242.     mainframe = Frame(fenetre, bg='white')
  243.     mainframe.grid()
  244.     calendrier = Calendrier(mainframe)
  245.     calendrier.calendrier()
  246.     calendrier.buttons()
  247.     calendrier.current_week()
  248.  
  249.     fenetre.mainloop() # Démarrage du réceptionnaire d'événements
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement