Développement d'une application de gestion des tâches avec PyQt

Tags :
  • POK
  • PyQt
  • Qt
  • Python
  • SQLite
Auteur :
  • Serigne Mbaye Sy AMAR
2024-2025

Ce POK vise à créer une application graphique de gestion des tâches avec PyQt et SQLite, en adoptant le modèle Kanban. L'application permet de gérer des tableaux, des listes et des cartes, avec des fonctionnalités comme le glisser-déposer, la gestion des échéances et l'ajout d'éléments visuels (étiquettes, checklists, pièces jointes). L'architecture du projet repose sur un modèle MVC qui permet une séparation entre la gestion des données, la logique métier et l'interface utilisateur. L'affichage est personnalisé avec QSS dans un thème dark moderne.

Prérequis

  • Une bonne base en python
  • Base en SQL

Objectifs principaux

  1. Développer une interface avec PyQt en structurant le projet selon l’architecture MVC pour séparer l’interface graphique la gestion des données et la logique métier.

  2. Implémenter un système de glisser-déposer (drag & drop) permettant de déplacer les cartes entre les listes sans bloquer l’interface.

  3. Gérer les données avec SQLite pour stocker les tableaux, listes, cartes, étiquettes et échéances.

  4. Avoir un design responsive avec QSS pour la personnalisation.


Recueil des besoins

Détails du recueil des besoins

ÉtapeRésultat attenduDifficultés rencontrées
Identification personnelle des besoinsDéfinir les fonctionnalités principales en tant qu'utilisateur (ajout de tableaux, gestion des cartes).Risque de vouloir tout intégrer dès le départ et de dépasser le cadre d’un projet MVP (produit minimum viable).
Analyse des outils existantsÉtudier Trello et d’autres outils similaires pour s’inspirer des fonctionnalités essentielles.Difficulté à rester focalisé sur les fonctionnalités indispensables sans ajouter des options superflues.
Étude des contraintes techniquesVérifier si les outils techniques choisis (par exemple PyQt et SQLite) peuvent répondre efficacement aux besoins.Découverte des limites techniques comme la gestion des performances avec des widgets complexes sous PyQt.
Prototypage rapideConcevoir une interface simple et fonctionnelle pour tester rapidement mes idées.Adapter rapidement les designs en fonction des tests et des ajustements nécessaires.

Note

Parmi les fonctionnalités minimales on a la gestion de tableaux dynamiques et la possibilité d’ajouter et modifier des cartes associées.

Fondements


Quelques réglages a faire avant le début

  • Installer PyQt 5 et SQLite sur ma machine.
  • Installer la dernière version de Python

Monitoring du projet

Back-log et organisation par sprints

Chaque sprint répond à une question principale.

Sprint 1 : Comment utiliser PyQt pour créer une interface fonctionnelle ?

Objectifs :

  1. Étudier PyQt et comprendre ses composants de base.

  2. Concevoir une interface simple permettant de visualiser des tableaux.

  3. Commencer l’intégration de styles via QSS.

Backlog :

Détails des activités du Sprint 1

DateHeures passéesIndications
16/01/20253.0hLecture et exercices sur PyQt (widgets de base).
16/01/20251.5hExploration des styles via QSS.
17/01/20252.0hDesign des tableaux avec QVBoxLayout.
18/01/20251.5hÉtude des signaux et slots.
18/01/20252.0hCréation de l'interface principale.

Total du sprint 1 : 10h.

Activités réalisées

  1. Étude des composants de PyQt

Pour cette partie, j'ai fait une découverte des widgets et de leur rôle dans la construction d'interfaces graphiques.

Nous avons comme Widgets :

Exemple - Création de widgets de base

Voici comment configurer un bouton et un label dans une interface :




button = QPushButton("Cliquez-moi")

label = QLabel("Bienvenue dans PyQt")

layout = QVBoxLayout()

layout.addWidget(button)

layout.addWidget(label)

widget.setLayout(layout)



Ce code crée une fenêtre simple avec un bouton et un label empilés verticalement.

1. Création d’un layout structuré pour afficher des tableaux

Exemple - Organisation de widgets avec QHBoxLayout




layout = QHBoxLayout()

button1 = QPushButton("Tableau 1")

button2 = QPushButton("Tableau 2")

layout.addWidget(button1)

layout.addWidget(button2)

widget.setLayout(layout)



Chaque bouton représente un tableau dans l’interface utilisateur.

2. Point sur la gestion des événements utilisateur avec les signaux et slots

Exemple : Ajouter un tableau lorsqu’un bouton est cliqué.

Exemple - Connexion d’un bouton à une action




button.clicked.connect(self.ajouter_tableau)

def ajouter_tableau(self):

print("Un nouveau tableau a été ajouté !")



Lorsque le bouton est cliqué, la fonction ajouter_tableau est déclenchée.

3. Apprentissage et application des styles QSS (Qt Style Sheets)

Exemple - Stylisation avec QSS

Fichier QSS pour personnaliser un bouton :




QPushButton {

background-color: #0079BF;

color: white;

border-radius: 5px;

}

QPushButton:hover {

background-color: #026AA7;

}



Le bouton change de couleur lorsque la souris passe dessus.


Ce que j'ai appris sur ce Sprint

  1. Composants de base PyQt :
  • QWidget, le composant de base pour créer une fenêtre ou un conteneur.

  • QHBoxLayout permet d’organiser les widgets horizontalement, ce qui est idéal pour une interface basée sur des ligne, comme sur mon projet Pytrello.

  • QPushButton et QLabel sont utilisés pour les interactions utilisateur de base.

  1. Gestion des layouts :
  • Si on utilise un QVBoxLayout imbriqué dans un QHBoxLayout, on peut organiser des colonnes de maniere dynamique, par exemple pour afficher des listes de cartes sous forme de tableaux.

  • Les marges et les espacements (setContentsMargins, setSpacing) permettent d'ajuster précisément l'apparence.

  1. Signaux et slots :
  • Les signaux comme clicked permettent de connecter un bouton à une action spécifique.

  • Les slots facilitent la gestion des interactions sans complexifier le code.

Ressources utilisées :

  • POK et Mon de Duc pour comprendre comment structurer les interfaces de manière modulaire (lien au niveau des sources).

Analyse post-mortem

Objectif clé réussi

Comprendre comment organiser et structurer une interface graphique avec PyQt.

Note

Les connaissances acquises dans ce sprint serviront de base pour intégrer des fonctionnalités dans le sprint futur.


A la fin de ce sprint, mon code a ete organise ainsi(architecture MVC) :

Livrable du sprint 1

La page de connexion:

image

La première page:

image

Note

L'un des défis majeurs de ce sprint a été l'optimisation du placement des widgets. J'avais besoin d'une bonne gestion des layouts pour éviter des problèmes d'affichage.

Sprint 2 : Comment intégrer une base de données SQLite et gérer les événements utilisateur ?

Objectifs :

  1. Implémenter une base de données SQLite pour persister les données des tableaux et cartes.

  2. Permettre la création, suppression et modification des tableaux par l’utilisateur.

  3. Intégrer une gestion des cartes dans chaque tableau.

Backlog :

Détails des activités du Sprint 2

DateHeures passéesIndications
24/02/20252.0hConfiguration de la base SQLite.
27/02/20253hGestion des tableaux de maniere dynamique.
28/02/20253.0hGestion des cartes dans les tableaux.
03/03/20253hTests et ajustements des styles.

Total du sprint 2 : 12h.

1. Conception de la base de données SQLite :

Ainsi :

a. J'ai crée une table boards pour stocker les tableaux de gestion des tâches, contenant un identifiant unique, un nom et une date de création. b. Puis une table cards pour stocker les cartes associées aux listes, avec un titre, une description, une échéance et une référence à la liste correspondante.

Ainsi que d'autres tables telle que :

c. users pour la gestion des utilisateurs d. lists pour stocker les listes dans les tableaux e. labels pour stocker les etiquettes pour les cartes f. card_labels qui fait Association entre cartes et étiquettes g. checklists pour stocker les listes de vérification h. checklist_items pour stocker Éléments des listes de vérification i. attachments pour stocker les pièces jointes

Les clés étrangèresi

Chaque tableau peut contenir plusieurs listes, et chaque liste peut contenir plusieurs cartes. Pour établir ces relations, des clés étrangères sont utilisées afin de lier les cartes à leurs tableaux respectifs.

Explication technique des relations

  • Un tableau (board) peut contenir plusieurs listes (lists).
  • Une liste (list) peut contenir plusieurs cartes (cards).
  • Une carte (card) peut être associée à plusieurs étiquettes (labels).
  • Une étiquette (label) peut être appliquée à plusieurs cartes (card_labels).

ON DELETE CASCADE ?

Les operations gérées de manière transactionnelle pour assurer la cohérence des données, en utilisant des clauses ON DELETE CASCADE dans les clés étrangères.

2. Gestion des signaux et événements utilisateur :

L’implémentation s’appuie sur le système de signaux et de slots de PyQt pour assurer une interaction fluide entre l’interface et la base de données. Pour se faire :

3. Stylisation via QSS :

Pour cette partie, j’ai regroupé les compétences acquises lors du sprint 1 sur l’utilisation de QSS pour la mise en forme de l’interface :


Analyse post-mortem


Livrable final

Vidéo - Fonctionnalités importantes

  1. Modifier et supprimer des tableaux.

  2. Ajouter, déplacer et supprimer des cartes dans les tableaux.

  3. Les données sont stockées dans une base SQLite.

  4. Utilisation de QSS pour un designe uniforme.

Le savais-tu ?

Mon readme sur github donne une explication tres claire sur le projet. Voici le lien vers le code source


Pistes d'amélioration

Sources :