1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| from tkinter import *
#from tkinter.messagebox import *
import calendar
#import tkinter as tk
import datetime
import locale
class Data:
def __init__(self):#remise zéro automatique des variables jour, mois, année, jour texte
self.day_selected = 0
self.month_selected = 0
self.year_selected = 0
self.day_name = 0
class Calendar:
def __init__(self, parent):# ???????????????J'AI BESOIN DE TRAVAILLER CE CONCEPT (parent)
self.parent = parent # ???????????????J'AI BESOIN DE TRAVAILLER CE CONCEPT (parent)
self.cal = calendar.TextCalendar(0)# 1er jour de calandar = Lundi
D = datetime.date.today()#D= date d'aujourd'hui
self.day_buttons = []# vidage des variables de boutons jours
self.current_date = ['', D.day, D.month, D.year]# Date courante = 4 items (jour texte= vide,jour d'aujourd'hui, mois d'aujourd'hui, année d'aujourd'hui)
self.minus_btn = Button(self.parent, text='<', command=self.go_prev)# Bouton incrémente mois -1
self.minus_btn.grid(row=0, column=1)# position ligne 1 colonne 2
self.header_lbl = Label(self.parent, height=2, text='{} {}'.format(calendar.month_abbr[D.month], str(D.year)))# écrit "mois en abbrégé & année" d'aujourd'hui dans le label haut
self.header_lbl.grid(row=0, column=2, columnspan=3)# position ligne 1 colonne3 sur colonnes 3,4,5
self.plus_btn = Button(self.parent, text='>', command=self.go_next)# Bouton incrémente mois +1
self.plus_btn.grid(row=0, column=5)# position ligne 1 colonne 6
days = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']# jours de la semaine (7 items)
for num, jj in enumerate(days): # pour num= nombre d'items de days(7)
t = Label(self.parent, text=jj[:3])# écrit 3 1ères lettres de chaque jour de la semaine
t.grid(row=1, column=num)# position ligne 2 colonnes = 0 à 6
self.setup()
self.date_lbl = Label(self.parent, height=2, text='%s %s %s %s' % tuple(self.current_date))# écrit label bas date courante =4 items à partir liste non modifiable: tuple(jour texte= vide,jour, mois, année)
self.date_lbl.grid(row=8, column=0, columnspan=5)# position ligne 9 colonne 1 sur colonnes 1,2,3,4,5
self.ok_btn = Button(self.parent, width=5, text='OK', command=self.export_date)# Bouton d'export date vers fenêtre principale
self.ok_btn.grid(row=9, column=2, columnspan=3, pady=10)# position ligne 10 colonne 3 sur colonnes 3,4,5, marge verticale 10
def clear(self):# reset des boutons jour
for w in self.day_buttons:# pour l'ensemble des lignes boutons jour
w.grid_forget()# reset position lignes
self.day_buttons = []# efface le contenu des boutons jour
def go_prev(self):# Incrémente mois date courante -1
if self.current_date[2] > 1:# si mois date courante >1
self.current_date[2] -= 1# mois date courante -1
else:
self.current_date[2] = 12# si mois date courante =12
self.current_date[3] -= 1# année date courante -1
self.reset_header()
self.clear()
self.setup()
def go_next(self):# Incrémente mois date courante +1
if self.current_date[2] < 12:# si mois date courante <12
self.current_date[2] += 1# mois date courante +1
else:
self.current_date[2] = 1# si mois date courante =1
self.current_date[3] += 1# année date courante +1
self.reset_header()
self.clear()
self.setup()
def reset_header(self):# Raffraichit le label haut "mois année" après action go_prev ou go_next
Resmois = calendar.month_abbr[self.current_date[2]]# nouvelle valeur mois date courante en abrégé
self.header_lbl['text'] = '%s %s' % (Resmois, self.current_date[3])# écrit nouvelles valeurs "mois année" dans le label
def selection(self, day, name):# Affecte nouvelles valeurs après action sur 1 des boutons jours
dt= datetime.datetime(self.current_date[3], self.current_date[2], day)# dt= date de année, mois et jours current_date sélectionnés
self.day_name = dt.strftime('%A')# définition de jour texte du jour sélectionné
self.current_date = [dt.strftime('%A'), day, dt.month, dt.year]# nouvelle valeur de current_date= 4 items (jour texte, jour, mois, année)
self.date_lbl['text'] = '%s %s %s %s'% tuple(self.current_date)# écrit label bas= 4 items de la liste non modifiable current_date (tuple)
self.clear()
self.setup()
def export_date(self):# Exporte la date courante dans la valeur par défaut de Entry fenêtre principale
VarDat.set('%s %s %s %s' % tuple(self.current_date))# écrit label bas= 4 items de la liste non modifiable current_date (tuple)
def setup(self):# calcul des boutons jours
m, y = self.current_date[2:4] # ??????? m = 2ème item date courante: jour, y = 4ème item date courante: année ???????? NON COMPRIS [2:4]
for w, week in enumerate(self.cal.monthdayscalendar(y, m), 2):# pour w = nombre d'items (Nbr semaines du mois/année date courante) en commençant???????? NON COMPRIS , 2)
for d, day in enumerate(week):# pour d = nombre d'items (Nbr jours de cette semaine)
if day:# tant qu'il y reste un jour
b = Button(self.parent, width=3, text=day, command=lambda day=day:self.selection(day, calendar.day_name[(day) % 7]))# colle la valeur de chaque jour
self.day_buttons.append(b)# sur chaque bouton jour
b.grid(row=w, column=d) # position un bouton par ligne = Nbre de semaines, un bouton par colonne= Nbre de jours
def Wcal(parent):# Fenetre fille ???????????????J'AI BESOIN DE TRAVAILLER CE CONCEPT (parent)
Wcal = Toplevel(parent)# affiliation de calendar
locale.setlocale(locale.LC_ALL, '')# Définition de temps local système (français dans ce cas)
cal = Calendar(Wcal)# Integre module Calandar dans fenêtre fille
FP = Tk()# Fenêtre mère
Button(FP, text='CALENDRIER', command=lambda:Wcal(FP)).grid(row=0, column=1)# bouton appel fenêtre fille Calendrier
VarDat= StringVar() # initialisation variable "Entry" en texte
Dat= Entry(FP, textvariable=VarDat, width=40, bg ='#fbfbec', fg='blue').grid(column=2,row=0)# Champ de saisie date recoit l'export date courante venant de Calendrier
FP.mainloop() |
Partager