Un calendrier-agenda codé en Python (1ère partie)

Bonjour à toutes et à tous,

Aujourd’hui, j’ai envie de vous présenter un programme que j’ai codé en Python, avec l’aide de la bibliothèque Tkinter. Il s’agit d’un calendrier mensuel dont chaque jour correspond à un bouton. Si vous cliquez sur l’un d’entre eux, vous ouvrez une page d’agenda qui correspond bien évidemment à la date sélectionnée.

Rien de bien révolutionnaire mais c’est un bon exercice pour les neurones. Vous trouverez ci-dessous quelques captures d’écran (figure 1 et figure 2). Je suis très satisfait du résultat car l’application est opérationnelle. Il ne me reste qu’un bout de code à corriger. Il s’agit des instructions qui mettent en surbrillance la date du jour. Par exemple, aujourd’hui, nous sommes le 18/04/2022. Je souhaite que le bouton 18 soit mis en surbrillance, et vous remarquez que ce n’est pas le cas.

Figure 1: Le calendrier
Figure 2: Une page de l’agenda

Structure du code

En ce qui concerne le code, sa structure est basée sur les modules et la commande suivante :

import calendar
import datetime

calendar.monthcalendar(time.localtime()[0], time.localtime()[1])

J’obtiens le mois et l’année actuels sous la forme d’une liste de listes. Les sous-listes correspondent aux semaines. Elles comptent toujours sept éléments qui sont, vous l’aurez deviné, les jours de la semaine (lundi, mardi etc…). Comme nous sommes en avril, le mois compte trente jours. Les zéros signifient qu’il n’y a pas d’association entre un jour de la semaine et une date. Ce mois-ci par exemple, il n’y a pas de 1er avril un jeudi.

[[0, 0, 0, 0, 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, 0]]

Je vous remets le figure n° 1 pour que vous puissiez comparer l’application avec la liste de listes. Tout correspond! J’ai donc placé mes boutons en fonction de la liste et pour des raisons de facilité, j’ai placé aussi les boutons qui portent le n° 0. Vous ne les voyez pas car ils sont de la même couleur que le fond gris. Je les appelle les dents creuses. Je pense que cette façon de procéder facilite grandement le travail.

Figure n° 1

Voici le code de l’application et les quelques documents annexes. Le fichier lanceur se nomme run.py. Il est impératif que Python3, tkinter et PIL Images soient préalablement installés. Si ce n’est pas le cas et que vous tournez sur une machine Linux de type Debian, exécutez les commandes suivantes :

sudo apt install python3
sudo apt install python3-tk
sudo apt install python3-pil.imagetk

J’ai pris soin de simplifier le code au maximum. Il est encore perfectible mais compte tenu de mon statut d’amateur qui n’a jamais touché à un ordinateur durant toute sa scolarité, je suis content de ma performance. La difficulté a été d’avancer vers le futur ou de reculer vers le passé de manière fluide et sans bug! Pour ce faire, il faut utiliser les petites flèches et tenir compte du fait que si vous passez du mois de décembre à celui de janvier, vous changez d’année.

Le programme, disponible en quatre langues (anglais, français, allemand et néerlandais), détecte la locale de l’ordinateur (c’est-à-dire la langue), et en fonction de la « clé » obtenue, il va piocher la valeur dans un dictionnaire que j’ai créé et que j’ai nommé self.languages.

Structure des fichiers de configuration

La structure des fichiers est très épurée puisqu’elle ne compte que deux éléments qui sont le lanceur run.py et un répertoire ne contenant qu’une seule icône! Mais dès que vous exécuterez le programme pour la première fois, un nouveau répertoire nommé Entries va apparaître. Et lorsque vous ouvrirez une page, un nouveau dossier nommé sous la forme jj-mm-aaaa sera automatiquement créé. Il contiendra trois fichiers intitulés matin, après-midi et soir. C’est ici que seront stockées les informations que vous avez enregistrées. Au prochain lancement du programme, celui-ci parcourt les pages du répertoire Entries et s’il trouve des répertoires vides, il les supprime.

Figure n° 3: Configuration initiale

La suite…

Je compte rajouter des fonctionnalités dans les semaine qui viennent:

Dans l’agenda
  • Possibilité de formater le texte (mettre en gras, en italique, surligner, etc…),
  • Possibilité de rajouter des images,
  • Rajouter des barres de défilement,
  • Savoir quels jours ont une page créée, si possible dans une vue synthétique.
Dans le calendrier
  • Donner la possibilité à l’utilisateur de modifier le design (couleurs, police, taille…),
  • Mettre en surbrillance le jour actuel. Curieusement, j’ai des difficultés à venir à bout de cette tâche,
  • Rajouter un bouton et une page mode d’emploi,
  • Et bien d’autres choses encore…

Conclusion

En conclusion, je dirais que ce calendrier-agenda n’a rien de bien révolutionnaire mais il a constitué pour moi, un excellent exercice de codage en Python. J’apprécierais grandement si quelqu’un pouvait me donner des conseils pour rendre mon code plus élégant. Je vais rajouter quelques boucles for mais je suis sûr qe je pourrais également travailler davantage avec les dictionnaires. En tout cas, le programme est opérationnel et vous pouvez d’ores et déjà le télécharger sur mon dépôt Gitlab.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s