This repository has been archived on 2022-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
GesMag/main.py

126 lines
6.2 KiB
Python
Raw Normal View History

import tkinter.messagebox as messagebox
from tkinter import *
from re import sub
from users import Utilisateurs # import de mon fichier pour gérer la base de donnée
def dimensionsFenetre(fenetre, taille: tuple):
"""Permet de définir une fenetre centrer sur l'écran"""
largeur = fenetre.winfo_screenwidth()
hauteur = fenetre.winfo_screenheight()
x = (largeur // 2) - (taille[0] // 2)
y = (hauteur // 2) - (taille[1] // 2)
fenetre.geometry(f"{taille[0]}x{taille[1]}+{x}+{y}")
class GesMag:
2021-11-19 18:52:58 +01:00
"""Programme de Gestion d'une caise de magasin."""
def demarrer(self) -> None:
"""Lance le programme GesMag."""
print("Lancement de l'interface de gestion d'une caisse d'un magasin...")
self.font = ("Comfortaa", 14) # police par défaut
Utilisateurs().creationTable() # on créer la base de donnée si elle n'existe pas déjà
self.parent = Tk() # on créer notre fenêtre principale
self._interfaceConnexion() # on créer la variable `self.f` qui est la frame a affiché
self.f.grid() # on affiche la frame
2021-11-19 00:47:01 +01:00
self.parent.mainloop() # on affiche la fenêtre
2021-11-19 00:47:01 +01:00
def motDePasseCorrect(self, motDPasse: str) -> tuple:
"""Détermine si un mot de passe suit la politique du programme ou non."""
if len(motDPasse) == 0: # si le champs est vide
return (False, "Mot de passe incorrect.")
if len(motDPasse) < 8: # si le mot de passe est plus petit que 8 caractères
return (False, "Un mot de passe doit faire 8 caractères minimum.")
"""
Pour le regex, je réfléchie comme dans la fonction `self.connexion`.
J'utilises pas `match` parce que je suis plus à l'aise avec `sub`.
"""
if not sub(r"[A-Z]", '', motDPasse) != motDPasse:
return (False, "Un mot de passe doit au moins contenir une lettre majuscule.")
if not sub(r"[a-z]", '', motDPasse) != motDPasse:
return (False, "Un mot de passe doit au moins contenir une lettre minuscule.")
if not sub(r" *?[^\w\s]+", '', motDPasse) != motDPasse:
return (False, "Un mot de passe doit au moins contenir un caractère spécial.")
return (True,) # si aucun des tests précédents n'est valide, alors le mot de passe est valide
def connexion(self, utilisateur: str, motDePasse: str):
2021-11-19 00:47:01 +01:00
"""Gère la connexion aux différentes interfaces de l'application."""
"""
Vérification nom d'utilisateur / mot de passe correctement entré
-> Pour le nom d'utilisateur on vérifie si le champs n'est pas vide
et si il y a bien que des lettres et des chiffres (le regex élimine tout
ce qui n'est pas ça, alors si la fonction `sub` renvoie pas exactement
la même chaîne de charactère alors c'est qu'il y avait un charactère
interdit dans le nom d'utilisateur).
-> Pour le mot de passe on demande à la fonction `motDePasseCorrect` pour
éviter de faire tout les tests ici.
"""
if len(utilisateur) == 0 or sub(r" *?[^\w\s]+", '', utilisateur) != utilisateur:
messagebox.showerror("Erreur", "Utilisateur incorrect.")
return
mdpOk = self.motDePasseCorrect(motDePasse)
if not mdpOk[0]:
messagebox.showerror("Erreur", mdpOk[1])
return
2021-11-19 00:47:01 +01:00
# Redirection vers la bonne interface
if Utilisateurs().verificationIdentifiants(utilisateur, motDePasse):
print("Bienvenue mon pote")
else:
print(f"Bah nan frérot c'est pas bon, ça c'est la liste des utilisateurs : {Utilisateurs().listUtilisateurs()}")
2021-11-19 00:47:01 +01:00
def _interfaceConnexion(self):
"""Affiche la fenêtre de connexion."""
# Paramètres de la fenêtre
2021-11-19 00:47:01 +01:00
dimensionsFenetre(self.parent, (400, 600))
self.parent.title("Fenêtre de connexion")
# Instanciation de la Frame, on va donc ajouter tout nos widgets à cet Frame
self.f = Frame(self.parent)
# Affichage des labels et boutons
2021-11-19 00:47:01 +01:00
tentativeDeConnexion = lambda _ = None: self.connexion(utilisateur.get(), motDpasse.get()) # lambda pour envoyer les informations entrés dans le formulaire
ecart = 80 # écart pour avoir un affichage centré
2021-11-19 00:47:01 +01:00
Label(self.f).grid(row=0, pady=50) # utilisé pour du padding (meilleur affichage)
2021-11-19 00:47:01 +01:00
Label(self.f, text="Utilisateur", font=self.font).grid(column=0, row=1, columnspan=2, padx=ecart - 20, pady=20, sticky=W)
utilisateur = Entry(self.f, font=self.font, width=18)
utilisateur.grid(column=1, row=2, columnspan=2, padx=ecart)
2021-11-19 00:47:01 +01:00
Label(self.f, text="Mot de passe", font=self.font).grid(column=0, row=3, columnspan=2, padx=ecart - 20, pady=20, sticky=W)
motDpasse = Entry(self.f, font=self.font, show='', width=18)
motDpasse.grid(column=1, row=4, columnspan=2, padx=ecart)
motDpasse.bind("<Return>", tentativeDeConnexion)
def __afficherMDP(self):
"""Permet de gérer l'affichage du mot de passe dans le champs sur la page de connexion."""
if self.mdpVisible == False: # si mot de passe caché, alors on l'affiche
self.mdpVisible = True
motDpasse.config(show='')
bouttonAffichageMDP.config(font=("Arial", 10, "overstrike"))
else: # inversement
self.mdpVisible = False
motDpasse.config(show='')
bouttonAffichageMDP.config(font=("Arial", 10))
2021-11-19 00:47:01 +01:00
bouttonAffichageMDP = Button(self.f, text='👁', command=lambda: __afficherMDP(self))
bouttonAffichageMDP.grid(column=2, row=4, columnspan=2)
self.mdpVisible = False
2021-11-19 00:47:01 +01:00
bouton = Button(self.f, text="Se connecter", font=self.font, command=tentativeDeConnexion)
bouton.grid(column=0, row=5, columnspan=3, padx=ecart, pady=20)
2021-11-19 00:47:01 +01:00
bouton.bind("<Return>", tentativeDeConnexion)
2021-11-19 17:14:15 +01:00
Button(self.f, text="Quitter", font=self.font, command=quit).grid(column=0, row=6, columnspan=4, pady=20)
if __name__ == "__main__":
2021-11-19 00:47:01 +01:00
""""Application "GesMag" pour le module de Programmation d'interfaces (2021-2022)"""
print("-- Compte par défaut --\nNom d'utilisateur: admin\nMot de passe: P@ssword\n")
GesMag().demarrer()