Advertisement
Kaadem-85

calendrier.py

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