0% ont trouvé ce document utile (0 vote)
18 vues13 pages

Programmation, Python, Algo

Le document présente un diagramme de classe UML pour une application de gestion des employés, comprenant les classes Employe, BaseDeDonnees, ApplicationTk et Statistiques. Chaque classe a des attributs et des méthodes spécifiques pour gérer les employés, la base de données, l'interface utilisateur et les statistiques. Un code Python est également fourni pour implémenter les fonctionnalités décrites dans le diagramme.

Transféré par

Anna Monti
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
18 vues13 pages

Programmation, Python, Algo

Le document présente un diagramme de classe UML pour une application de gestion des employés, comprenant les classes Employe, BaseDeDonnees, ApplicationTk et Statistiques. Chaque classe a des attributs et des méthodes spécifiques pour gérer les employés, la base de données, l'interface utilisateur et les statistiques. Un code Python est également fourni pour implémenter les fonctionnalités décrites dans le diagramme.

Transféré par

Anna Monti
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Diagramme de classe

Classes Identifiées :

1. Employe

o Représente un employé avec ses attributs (nom, prénom, âge, etc.).

2. BaseDeDonnees

o Gère la connexion à la base de données SQLite et les requêtes associées.

3. ApplicationTk

o Interface graphique Tkinter avec divers widgets et interactions.

4. Statistiques

o Contient les méthodes pour calculer et exporter les statistiques sous


différents formats.

Diagramme de Classe UML :

+----------------------------------+

| Employe |

+----------------------------------+

| - prenom: str |

| - nom: str |

| - age: int |

| - departement: str |

| - salaire: float |

| - sexe: str |

+----------------------------------+

| + __init__(self, prenom, ...) |

+----------------------------------+
|

| 1..*

+----------------------------------+

| BaseDeDonnees |

+----------------------------------+

| - connexion: [Link] |

+----------------------------------+

| + connect_db() |

| + creer_table() |

| + charger_donnees() |

| + sauvegarder_dans_db() |

+----------------------------------+

| Utilise

+----------------------------------+

| ApplicationTk |

+----------------------------------+

| - root: [Link] |
| - employes: list |

+----------------------------------+

| + __init__() |

| + ajouter_employe() |

| + importer_excel() |

| + afficher_tableau() |

| + afficher_statistiques() |

| + stats_hommes() |

| + stats_femmes() |

| + afficher_stats_departement() |

| + afficher_difference_salaire() |

+----------------------------------+

| Appelle

+----------------------------------+

| Statistiques |

+----------------------------------+

| + exporter_statistiques() |

| + afficher_stats() |

+----------------------------------+

Ce diagramme montre la relation entre les classes principales :

 Employe représente les employés.


 BaseDeDonnees gère les opérations sur la base de données.

 ApplicationTk représente l'interface utilisateur et interagit avec la base de données


et les statistiques.

 Statistiques fournit des méthodes pour analyser et exporter les données.

Code python

import tkinter as tk
from tkinter import ttk, filedialog, messagebox, simpledialog
import pandas as pd
import statistics
import [Link] as plt
from [Link].backend_tkagg import FigureCanvasTkAgg
import numpy as np
from PIL import Image, ImageTk
from docx import Document
import sqlite3

# Connexion à SQLite
def connect_db():
return [Link]("[Link]")

def creer_table():
conn = connect_db()
cur = [Link]()
[Link]('''
CREATE TABLE IF NOT EXISTS employes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
prenom TEXT,
nom TEXT,
age INT,
departement TEXT,
salaire FLOAT,
sexe TEXT
)
''')
[Link]()
[Link]()

creer_table()

def charger_donnees():
global employes
conn = connect_db()
cur = [Link]()
[Link]("SELECT prenom, nom, age, departement, salaire, sexe FROM
employes")
rows = [Link]()
employes = [
{"Prénom": row[0], "Nom": row[1], "Âge": row[2], "Département": row[3],
"Salaire": row[4], "Sexe": row[5]}
for row in rows
]
[Link]()

employes = []

def exporter_statistiques(format):
file_path = [Link](defaultextension=f'.{format}',
filetypes=[("Excel", "*.xlsx"), ("Word", "*.docx")])
if not file_path:
return

stats_data = {
"Max Salaire": max(emp["Salaire"] for emp in employes),
"Min Salaire": min(emp["Salaire"] for emp in employes),
"Salaire Moyen": sum(emp["Salaire"] for emp in employes) /
len(employes),
"Médiane": [Link]([emp["Salaire"] for emp in employes]),
"Mode": [Link]([emp["Salaire"] for emp in employes])
}

if format == "xlsx":
df = [Link]([stats_data])
df.to_excel(file_path, index=False)
elif format == "docx":
doc = Document()
doc.add_heading("Statistiques des Salaires", level=1)
for key, value in stats_data.items():
doc.add_paragraph(f"{key}: {value}")
[Link](file_path)

[Link]("Exportation réussie", f"Statistiques exportées en


{[Link]()} avec succès!")

def ajouter_employe():
try:
employe = {
"Nom": nom_entry.get(),
"Prénom": prenom_entry.get(),
"Âge": int(age_entry.get()),
"Département": depart_entry.get(),
"Salaire": float(salaire_entry.get()),
"Sexe": sexe_entry.get().upper()
}
[Link](employe)
[Link]("Succès", "Employé ajouté avec succès")
afficher_tableau()

nom_entry.delete(0, [Link])
prenom_entry.delete(0, [Link])
depart_entry.delete(0, [Link])
age_entry.delete(0, [Link])
salaire_entry.delete(0, [Link])
sexe_entry.delete(0, [Link])
except ValueError:
[Link]("Erreur", "Veuillez entrer des valeurs valides")
conn = connect_db()
cur = [Link]()
[Link](
"INSERT INTO employes (prenom, nom, age, departement, salaire, sexe)
VALUES (?, ?, ?, ?, ?, ?)",
(emp["Prénom"], emp["Nom"], emp["Âge"], emp["Département"],
emp["Salaire"], emp["Sexe"])
)
[Link]()
[Link]()

[Link]("Succès", "Employé ajouté avec succès!")

def sauvegarder_dans_db():
conn = connect_db()
cur = [Link]()
for emp in employes:
[Link](
"INSERT INTO employes (prenom, nom, age, departement, salaire,
sexe) VALUES (?, ?, ?, ?, ?, ?)",
(emp["Prénom"], emp["Nom"], emp["Âge"], emp["Département"],
emp["Salaire"], emp["Sexe"])
)
[Link]()
[Link]()
[Link]("Succès", "Toutes les données ont été sauvegardées
dans la base de données!")

def importer_excel():
file_path = [Link](filetypes=[("Excel Files",
".xlsx;.xls")])
if file_path:
df = pd.read_excel(file_path)
[Link](df.to_dict(orient='records'))
afficher_tableau()
[Link]("Succès", "Données importées avec succès")

def afficher_tableau():
for row in tableau.get_children():
[Link](row)
for emp in employes:
[Link]("", "end",
values=(emp["Nom"], emp["Prénom"], emp["Âge"],
emp["Département"], emp["Salaire"], emp["Sexe"]))

def afficher_stats(liste, titre):


if not liste:
[Link]("Aucune donnée", "Pas de données
disponibles")
return

salaires = [emp["Salaire"] for emp in liste]


max_salaire, min_salaire, avg_salaire = max(salaires), min(salaires),
sum(salaires) / len(salaires)
median_salaire = [Link](salaires)
mode_salaire = [Link](salaires)
variance_salaire = [Link](salaires)
ecart_type_salaire = [Link](salaires)

fenetre_stats = [Link](root)
fenetre_stats.title(titre)
fenetre_stats.geometry("600x500")
fenetre_stats.configure(bg="#f0f0f0")

frame = [Link](fenetre_stats, padding=10)


[Link](fill="both", expand=True)

[Link](fenetre_stats, text=f"Salaire le plus élevé: {max_salaire}",


font=("Arial", 12)).pack(pady=5)
[Link](fenetre_stats, text=f"Salaire le plus bas: {min_salaire}",
font=("Arial", 12)).pack(pady=5)
[Link](fenetre_stats, text=f"Salaire moyen: {avg_salaire:.2f}",
font=("Arial", 12)).pack(pady=5)
[Link](fenetre_stats, text=f"Médiane: {median_salaire}", font=("Arial",
12)).pack(pady=5)
[Link](fenetre_stats, text=f"Mode: {mode_salaire}", font=("Arial",
12)).pack(pady=5)
[Link](fenetre_stats, text=f"Variance: {variance_salaire:.2f}",
font=("Arial", 12)).pack(pady=5)
[Link](fenetre_stats, text=f"Écart type: {ecart_type_salaire:.2f}",
font=("Arial", 12)).pack(pady=5)

fig, axs = [Link](1, 3, figsize=(15, 5))

# Histogramme groupé
bins = [Link](min_salaire, max_salaire, 6)
axs[0].hist(salaires, bins=bins, color='blue', alpha=0.7, label='Salaires')
axs[0].set_title("Histogramme Groupé")
axs[0].set_xlabel("Salaires")
axs[0].set_ylabel("Nombre d'employés")
axs[0].legend()

# Courbe empilée
sorted_salaries = sorted(salaires)
axs[1].plot(sorted_salaries, [Link](1, len(sorted_salaries) + 1),
marker='o', linestyle='-', color='green')
axs[1].set_title("Courbe Empilée")
axs[1].set_xlabel("Salaires")
axs[1].set_ylabel("Distribution cumulative")

# Graphique en secteur (pie chart)


labels = ['Bas salaire', 'Moyen salaire', 'Haut salaire']
sizes = [sum(1 for s in salaires if s < avg_salaire * 0.8),
sum(1 for s in salaires if avg_salaire * 0.8 <= s <= avg_salaire * 1.2),
sum(1 for s in salaires if s > avg_salaire * 1.2)]
axs[2].pie(sizes, labels=labels, autopct='%1.1f%%', colors=['red', 'yellow',
'green'])
axs[2].set_title("Répartition des Salaires")

plt.tight_layout()
canvas = FigureCanvasTkAgg(fig, master=fenetre_stats)
[Link]()
canvas.get_tk_widget().pack(fill=[Link], expand=True)

[Link](fenetre_stats, text="Exporter en Excel", command=lambda:


exporter_statistiques("xlsx")).pack(pady=5)
[Link](fenetre_stats, text="Exporter en Word", command=lambda:
exporter_statistiques("docx")).pack(pady=5)

def afficher_statistiques():
afficher_stats(employes, "Statistiques Globales")

def stats_hommes():
hommes = [emp for emp in employes if emp["Sexe"] == "M"]
afficher_stats(hommes, "Statistiques Hommes")
def stats_femmes():
femmes = [emp for emp in employes if emp["Sexe"] == "F"]
afficher_stats(femmes, "Statistiques Femmes")

def afficher_stats_departement():
if not employes:
[Link]("Aucune donnée", "Pas de données
disponibles")
return

departements = list(set(emp["Département"] for emp in employes))


choix = [Link]("Sélection Département", f"Choisissez un
département:\n{', '.join(departements)}")

if choix and choix in departements:


depart_liste = [emp for emp in employes if emp["Département"] == choix]
afficher_stats(depart_liste, f"Statistiques - {choix}")
else:
[Link]("Erreur", "Département invalide")

def afficher_difference_salaire():
if not employes:
[Link]("Aucune donnée", "Pas de données
disponibles")
return

salaires = [emp["Salaire"] for emp in employes]


avg_salaire = sum(salaires) / len(salaires)

fenetre_diff = [Link](root)
fenetre_diff.title("Différences de Salaire")
fenetre_diff.configure(bg="#f0f0f0")

for emp in employes:


diff = emp["Salaire"] - avg_salaire
[Link](fenetre_diff, text=f"{emp['Nom']} {emp['Prénom']}: {diff:+.2f}€",
font=("Arial", 12)).pack(pady=2)

root = [Link]()
[Link]("Gestion des Salaires")
[Link]("800x600")
[Link](bg="#e6e6e6")

style = [Link]()
[Link]("TButton", font=("Arial", 10), padding=5, relief="flat",
borderwidth=5, foreground="black")
[Link]("TButton", background=[("active", "#45a049")])

def resize_background(event):
"""Redimensionne l'image de fond pour s'adapter à la fenêtre."""
new_width, new_height = [Link], [Link]
resized_image = original_image.resize((new_width, new_height),)
new_photo = [Link](resized_image)

background_label.config(image=new_photo)
background_label.image = new_photo # Empêcher le garbage collector de
supprimer l'image

# Charger et redimensionner l'image


original_image = [Link]("[Link]")
photo = [Link](original_image)

# Ajouter un label pour l'image de fond


background_label = [Link](root, image=photo)
background_label.place(relwidth=1, relheight=1)

# Lier l'événement de redimensionnement


[Link]("<Configure>", resize_background)

frame = [Link](root, padding=10)


[Link](pady=10)
fields = ["Prénom", "Nom", "Âge", "Département", "Salaire", "Sexe (M/F)"]
entries = {}
for i, field in enumerate(fields):
[Link](frame, text=f"{field}:").grid(row=i, column=0, padx=5, pady=5)
entry = [Link](frame)
[Link](row=i, column=1, padx=5, pady=5)
entries[field] = entry

nom_entry = entries["Nom"]
prenom_entry = entries["Prénom"]
age_entry = entries["Âge"]
depart_entry = entries["Département"]
salaire_entry = entries["Salaire"]
sexe_entry = entries["Sexe (M/F)"]

columns = ("Nom", "Prénom", "Âge", "Département", "Salaire", "Sexe")


tableau = [Link](root, columns=columns, show="headings")
for col in columns:
[Link](col, text=col)
[Link](col, width=100, anchor="center")
[Link](pady=5)

[Link](pady=5, expand=True)

buttons = [
("Ajouter", ajouter_employe),
("Importer Excel", importer_excel),
("Statistiques", afficher_statistiques),
("Statistiques Hommes", stats_hommes),
("Statistiques Femmes", stats_femmes),
("Différence Salaire", afficher_difference_salaire),
("Statistiques par Département", afficher_stats_departement),
("Sauvegarder dans DB", sauvegarder_dans_db)
]

for text, command in buttons:


[Link](root, text=text, command=command,
style="TButton").pack(pady=5)
charger_donnees()
[Link]()

Vous aimerez peut-être aussi