2021-11-19 21:14:14 +01:00
\documentclass { article}
\usepackage [french] { babel} % français
\usepackage [T1] { fontenc} % encodage
\usepackage [hidelinks] { hyperref} % liens cliquable dans la table des matières
\usepackage { graphicx} % images
\usepackage { listingsutf8} % intégration code
\usepackage { xcolor} % couleurs personnalisés
\usepackage { geometry} % change les dimensions de la page
\usepackage { enumitem} % liste personnalisée
\usepackage { amssymb, pifont} % police (todolist)
2021-11-20 00:23:13 +01:00
\renewcommand { \familydefault } { \sfdefault } % police en "sans-serif"
2021-11-19 21:14:14 +01:00
\geometry { % définition taille pages
a4paper,
left=20mm,
top=20mm
}
2021-11-20 02:50:07 +01:00
% Définition de la liste de choses à faire/faites (https://tex.stackexchange.com/a/502353)
2021-11-19 21:14:14 +01:00
\newlist { todolist} { itemize} { 3}
\setlist [todolist] { label=$ \square $ }
2021-11-20 00:15:59 +01:00
\newcommand { \fait } { \rlap { \raisebox { 0.3ex} { \hspace { 0.4ex} \tiny \ding { 52} } } $ \square $ }
2021-11-20 18:42:14 +01:00
\newcommand { \faitDifferemment } { \rlap { \raisebox { 0.3ex} { \hspace { 0.4ex} \scriptsize \ding { 56} } } $ \square $ }
2021-11-19 21:14:14 +01:00
2021-11-29 09:19:32 +01:00
% Définition blocs de codes
2021-11-19 21:14:14 +01:00
\lstset {
breaklines=true,
extendedchars=true,
inputencoding=utf8/latin1
}
% Python definition (c) 1998 Michael Weber
2021-11-20 00:30:55 +01:00
% Définitions supplémentaires (2013) Alexis Dimitriadis
% Modifié par https://tex.stackexchange.com/q/235783 et par moi-même
2021-11-19 21:14:14 +01:00
\definecolor { maroon} { cmyk} { 0, 0.87, 0.68, 0.32}
\definecolor { halfgray} { gray} { 0.55}
\definecolor { ipython_ frame} { RGB} { 207, 207, 207}
\definecolor { ipython_ bg} { RGB} { 247, 247, 247}
\definecolor { ipython_ red} { RGB} { 186, 33, 33}
\definecolor { ipython_ green} { RGB} { 0, 128, 0}
\definecolor { ipython_ cyan} { RGB} { 64, 128, 128}
\definecolor { ipython_ purple} { RGB} { 170, 34, 255}
\lstdefinelanguage { iPython} {
morekeywords={ access,and,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,return,try,while} ,
morekeywords=[2]{ abs,all,any,basestring,bin,bool,bytearray,callable,chr,classmethod,cmp,compile,complex,delattr,dict,dir,divmod,enumerate,eval,execfile,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,int,isinstance,issubclass,iter,len,list,locals,long,map,max,memoryview,min,next,object,oct,open,ord,pow,property,range,raw_ input,reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,vars,xrange,zip,apply,buffer,coerce,intern} ,
sensitive=true,
morecomment=[l]\# ,
morestring=[b]',
morestring=[b]",
morecomment=[s]{ """} { """} ,
morestring=[s]{ '''} { '''} ,
morestring=[s]{ r'} { '} ,
morestring=[s]{ r"} { "} ,
morestring=[s]{ r'''} { '''} ,
morestring=[s]{ r"""} { """} ,
morestring=[s]{ u'} { '} ,
morestring=[s]{ u"} { "} ,
morestring=[s]{ u'''} { '''} ,
morestring=[s]{ u"""} { """} ,
literate=
*{ +} { { { \color { ipython_ purple} +} } } 1
{ -} { { { \color { ipython_ purple} -} } } 1
{ *} { { { \color { ipython_ purple} $ ^ \ast $ } } } 1
{ /} { { { \color { ipython_ purple} /} } } 1
{ ^ } { { { \color { ipython_ purple} \^ { } } } } 1
{ ?} { { { \color { ipython_ purple} ?} } } 1
{ !} { { { \color { ipython_ purple} !} } } 1
{ \% } { { { \color { ipython_ purple} \% } } } 1
{ <} { { { \color { ipython_ purple} <} } } 1
{ >} { { { \color { ipython_ purple} >} } } 1
{ |} { { { \color { ipython_ purple} |} } } 1
{ \& } { { { \color { ipython_ purple} \& } } } 1
{ ~} { { { \color { ipython_ purple} ~} } } 1
{ ==} { { { \color { ipython_ purple} ==} } } 2
{ <=} { { { \color { ipython_ purple} <=} } } 2
{ >=} { { { \color { ipython_ purple} >=} } } 2
{ +=} { { { +=} } } 2
{ -=} { { { -=} } } 2
{ *=} { { { $ ^ \ast $ =} } } 2
{ /=} { { { /=} } } 2,
commentstyle=\color { ipython_ cyan} \ttfamily ,
stringstyle=\color { ipython_ red} \ttfamily ,
keepspaces=true,
showspaces=false,
showstringspaces=false,
rulecolor=\color { ipython_ frame} ,
frame=single,
frameround={ t} { t} { t} { t} ,
framexleftmargin=6mm,
numbers=left,
numberstyle=\tiny \color { halfgray} ,
backgroundcolor=\color { ipython_ bg} ,
basicstyle=\scriptsize \ttfamily ,
keywordstyle=\color { ipython_ green} \ttfamily ,
escapechar=\¢ ,
escapebegin=\color { ipython_ green} ,
}
2021-11-20 02:43:20 +01:00
\title { \href { https://git.kennel.ml/Anri/GesMag} { Projet final Tkinter} }
2021-11-19 21:37:54 +01:00
\author { Anri Kennel\thanks { Numéro d'étudiant : 20010664} \, (L2-A)\\ Module Programmation d’ interfaces $ \cdot $ Paris 8}
\date { Année universitaire 2021-2022}
2021-11-19 21:14:14 +01:00
\begin { document}
\maketitle
\tableofcontents
\begin { center}
\emph { Les explications sont en commentaire du code.}
\end { center}
\clearpage
\section { Consigne}
2021-11-26 13:17:40 +01:00
Ici ce trouve le cahier des charges du programme. Toutes les améliorations, apportés au programme sont rangés à côtés du champs correspondant, en gras.
Pour les éléments ajoutés au programme qui ne rentre dans aucune cases, il y a une catégorie "À savoir" à la fin du cahier des charges qui les précise. Il y a aussi des informations complémentaire par rapport au projet.
2021-11-29 00:27:16 +01:00
\subsection { Dépendances}
Les modules externes utilisés sont :
\begin { itemize}
\item [\textbullet] \texttt { tkinter} pour la GUI
\begin { itemize}
2021-11-29 11:33:57 +01:00
\item [\textopenbullet] \texttt { .ttk} pour la liste déroulante et les lignes qui séparent les cases du tableau
2021-11-29 00:27:16 +01:00
\item [\textopenbullet] \texttt { .messagebox} pour les messages pop-up
\item [\textopenbullet] \texttt { .filedialog} pour la boîte de dialogue du fichier
\end { itemize}
\item [\textbullet] \texttt { re} pour le regex
\item [\textbullet] \texttt { datetime} pour le temps
\item [\textbullet] \texttt { sqlite3} pour la base de donnée SQLite
\item [\textbullet] \texttt { random} pour la génération du stock (prix et quantité)
\end { itemize}
\subsection { Cahier des charges}
2021-11-19 21:14:14 +01:00
\begin { todolist}
\item [\fait] Page de login \texttt { /1.5}
\begin { todolist}
\item [\fait] Nom d'utilisateur ne contient que des lettres et des chiffres
2021-11-20 18:45:03 +01:00
\item [\fait] Mot de passe de minimum 8 caractères dont 1 caractère spécial, une majuscule et une minuscule \textbf { $ \Rightarrow $ possibilité d'afficher ou non le mot de passe en clair}
2021-11-20 18:42:14 +01:00
\item [\fait] Un bouton de connexion \textbf { $ \Rightarrow $ possibilité aussi d'utiliser la touche \texttt { Entrer} \textit { (pour aller plus vite)} qui permet de se rendre sur l'interface Caissier ou Manager}
2021-11-19 21:14:14 +01:00
\item [\fait] Un bouton pour quitter l'application
\end { todolist}
\item Page de manager (définit par un nom d'utilisateur et un mot de passe) \texttt { /7.5}
\begin { todolist}
2021-11-26 13:17:40 +01:00
\item [\faitDifferemment] Peut ajouter et supprimer un caissier \textbf { $ \Rightarrow $ lisiblité accru pour les champs mal renseignés, l'ID n'est pas à renseigné car assigné automatiquent par la base de donnée}
2021-11-20 18:42:14 +01:00
\item [\faitDifferemment] Peut voir la liste des caissiers \textbf { $ \Rightarrow $ possibilité d'ouvrir des informations étendues sur un utilisateur, ainsi que de filtrer les utilisateurs (manager et caissiers) mais impossible de tout déselectionner (caissier par défaut)}
2021-11-29 13:56:00 +01:00
\item Un histogramme présentant l'évolution des sommes totales des ventes journalières de la semaine passée d'un utilisateur \textbf { $ \Rightarrow $ accessible au double-clique dans la fenêtre des informations étendues d'un utilisateur}
2021-11-20 19:47:25 +01:00
\item [\fait] Un bouton pour vider tous les champs de saisie
2021-11-26 13:17:40 +01:00
\item [\faitDifferemment] Un bouton pour quitter l'application \textbf { $ \Rightarrow $ j'ai préféré mettre un bouton pour se déconnecter}
\item [\fait] Un bouton pour se mettre en "mode caissier"
2021-11-19 21:14:14 +01:00
\end { todolist}
2021-11-29 00:18:06 +01:00
\item Page de caissier (définit par un identifiant, un nom d'utilisateur, un mot de passe, un nom, un prenom, une date de naissance, une adresse et un code postal) \texttt { /6}
2021-11-19 21:14:14 +01:00
\begin { todolist}
2021-11-26 13:17:40 +01:00
\item [\fait] Afficher le stock disponible
2021-11-19 21:14:14 +01:00
\begin { todolist}
2021-11-26 13:17:40 +01:00
\item [\faitDifferemment] 4 rayons de chacun au moins 10 articles de votre choix (fruits/légumes, boulangerie, boucherie/poissonnerie ou produits d'entretien) \textbf { $ \Rightarrow $ toutes les images sont aux dimensions 50x50 et ont étés converties avec le logiciel Gimp}
\item [\faitDifferemment] Au clic sur le produit, l'identifiant, le nom, la quantité en stock et le prix s'affichent \textbf { $ \Rightarrow $ tout est affiché directement, pas besoin de cliquer sur le produit, il y a aussi un système de pages pour une meilleur lisibilité (10 éléments par page au maximum)}
2021-11-19 21:14:14 +01:00
\end { todolist}
2021-11-28 12:53:07 +01:00
\item [\fait] Possibilité de rajouter des produits en stock
2021-11-19 21:14:14 +01:00
\item Affichage d'un ticket de caisse
\begin { todolist}
2021-11-29 13:12:30 +01:00
\item [\fait] Date de vente
\item [\fait] ID, nom, quantité, prix des produits achetés
\item [\fait] Prix total
2021-11-19 21:14:14 +01:00
\item Un bouton pour valider
\end { todolist}
2021-11-29 09:19:32 +01:00
\item Interface d'export des statistiques (stock le montant total de vente par jour) \textbf { $ \Rightarrow $ export au format \texttt { CSV} }
2021-11-19 21:14:14 +01:00
\end { todolist}
\end { todolist}
Avec à savoir :
\begin { todolist}
2021-11-20 18:42:14 +01:00
\item [\fait] Ergonomie \texttt { /2}
\begin { todolist}
\item [\faitDifferemment] Utilisation de \texttt { Frame} et peu de \texttt { TopLevel} , ainsi qu'une seule fenêtre \texttt { Tk} pour éviter de multiples ouverture/fermeture de fenêtre durant l'utilisation de l'application
\end { todolist}
2021-11-19 21:14:14 +01:00
\item [\fait] Utilisateurs stockés dans la base de donnée \texttt { /2}
\begin { todolist}
2021-11-20 18:42:14 +01:00
\item [\faitDifferemment] Possibilité de recréer la base de donnée automatiquement si elle n'existe plus
2021-11-19 21:14:14 +01:00
\end { todolist}
2021-11-20 18:42:14 +01:00
\item [\faitDifferemment] Ajout d'autres fonctionnalités \texttt { /1}
2021-11-19 21:14:14 +01:00
\begin { todolist}
2021-11-20 18:46:59 +01:00
\item [\faitDifferemment] J'ai pas vraiment ajouter une toute nouvelle fonctionnalité, mais améliorer ce qui était demandé pour une plus grande souplesse à l'utilisation (cf. les cases cochés avec des \ding { 56} )
2021-11-20 18:42:14 +01:00
% \item Heure de connexion stricte pour les caissiers
% \item Meilleur caissier (avec le plus de ventes sur la journée/semaine précédente par exemple)
% \item Exporter le ticket de caisse en format image
% \item Chiffrer les mots de passes dans la base de donnée
2021-11-19 21:14:14 +01:00
\end { todolist}
2021-11-20 18:42:14 +01:00
\item [\faitDifferemment] Lisibilité du code
2021-11-19 21:14:14 +01:00
\begin { todolist}
2021-11-20 18:47:41 +01:00
\item [\faitDifferemment] Toutes les fonctions sont commentés et typés (quand possible car j'utilises Python \texttt { 3.9.7} )
2021-11-20 18:42:14 +01:00
\item [\faitDifferemment] Tous le code est dans une classe et non directement dans le code (donc aucune variable globale)
\item [\faitDifferemment] Plusieurs fichiers pour une meilleur lisibilité
2021-11-19 21:14:14 +01:00
\end { todolist}
2021-11-26 13:17:40 +01:00
\item [\faitDifferemment] Affichage sous forme de tableau
\begin { todolist}
2021-11-28 23:23:06 +01:00
\item [\faitDifferemment] J'ai évité d'utiliser le widget \texttt { Treeview} du module \texttt { ttk} de tkinter car je le trouve que peu pratique/flexible (exemple : impossibilité de mettre des images dans les colonnes du tableau) alors j'ai développé une alternative (cf. l'affiche du stock avec un système de page)
2021-11-26 13:17:40 +01:00
\end { todolist}
2021-11-19 21:14:14 +01:00
\end { todolist}
\clearpage
\section { Code}
2021-11-20 02:53:26 +01:00
\subsection [\texttt{main.py}] { \texttt { main.py} , fichier principal}
2021-11-19 21:14:14 +01:00
\begin { lstinputlisting} [language=iPython]{ ../main.py} \end { lstinputlisting}
\subsection [\texttt{db.py}] { \texttt { db.py} , gère la communication avec la base de donnée en sa globalité}
\begin { lstinputlisting} [language=iPython]{ ../db.py} \end { lstinputlisting}
2021-11-20 02:53:26 +01:00
\subsection [\texttt{users.py}] { \texttt { users.py} , implante la base de donnée pour les utilisateurs}
2021-11-19 21:14:14 +01:00
\begin { lstinputlisting} [language=iPython]{ ../users.py} \end { lstinputlisting}
2021-11-29 14:03:26 +01:00
\subsection [\texttt{stock.py}] { \texttt { stock.py} , implante la base de donnée pour le stock}
\begin { lstinputlisting} [language=iPython]{ ../stock.py} \end { lstinputlisting}
2021-11-29 14:30:41 +01:00
\subsection [\texttt{stats.py}] { \texttt { stats.py} , implante la gestion des statistiques et son export en format \texttt { CSV} }
2021-11-29 14:11:25 +01:00
\begin { lstinputlisting} [language=iPython]{ ../stats.py} \end { lstinputlisting}
2021-11-29 14:03:26 +01:00
2021-11-19 21:14:14 +01:00
\end { document}