first depot
commit
f1fe243f22
@ -0,0 +1,254 @@
|
|||||||
|
from tkinter import ttk
|
||||||
|
import sqlite3
|
||||||
|
from tkinter import Tk, Label, Entry, Button, messagebox, Listbox, END, Toplevel, IntVar, Checkbutton
|
||||||
|
from datetime import datetime
|
||||||
|
#from tabulate import tabulate
|
||||||
|
|
||||||
|
titres = ["ID", "Date de Candidature", "Nom Société", "Téléphone", "Réponse Société", "+"]
|
||||||
|
|
||||||
|
# Fonction pour ajouter une recherche de stage
|
||||||
|
def ajouter_recherche():
|
||||||
|
date_candidature = datetime.now().strftime('%d-%m-%Y %H:%M')
|
||||||
|
cv_envoyes = cv_var.get()
|
||||||
|
lettre_envoyes = lettre_var.get()
|
||||||
|
nom_societe = entry_nom_societe.get()
|
||||||
|
telephone = entry_telephone.get()
|
||||||
|
lien_recrutement = entry_lien_recrutement.get()
|
||||||
|
|
||||||
|
# Ajouter la recherche dans la base de données
|
||||||
|
cursor.execute('''
|
||||||
|
INSERT INTO recherches_stages (date_candidature, nom_societe, telephone, reponse_societe, lien_recrutement, cv_envoyes, lettre_envoyes,)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||||
|
''', (date_candidature,nom_societe, telephone, lien_recrutement, cv_envoyes, lettre_envoyes, None))
|
||||||
|
conn.commit()
|
||||||
|
messagebox.showinfo("Succès", "Recherche de stage ajoutée avec succès")
|
||||||
|
mettre_a_jour_listbox() # Mettre à jour la liste après l'ajout
|
||||||
|
|
||||||
|
def mettre_a_jour_treeview():
|
||||||
|
treeview_recherches.delete(*treeview_recherches.get_children())
|
||||||
|
try:
|
||||||
|
cursor.execute('SELECT * FROM recherches_stages')
|
||||||
|
resultats = cursor.fetchall()
|
||||||
|
|
||||||
|
treeview_recherches['columns'] = titres[:-1] # Enlève le "+" de la dernière colonne
|
||||||
|
for titre in titres:
|
||||||
|
if titre == "+":
|
||||||
|
continue # Ne configure pas de colonne pour le bouton "+"
|
||||||
|
treeview_recherches.heading(titre, text=titre, anchor='center')
|
||||||
|
treeview_recherches.column(titre, anchor='center', width=150) # Ajustez la largeur selon vos besoins
|
||||||
|
|
||||||
|
for resultat in resultats:
|
||||||
|
treeview_recherches.insert('', 'end', values=resultat) # Ajoute une cellule vide pour le bouton "+"
|
||||||
|
|
||||||
|
# Configure le bouton "+" pour chaque élément
|
||||||
|
for item_id in treeview_recherches.get_children():
|
||||||
|
treeview_recherches.item(item_id, tags=(item_id,)) # Associe l'identifiant de l'élément comme tag
|
||||||
|
treeview_recherches.tag_bind(item_id, '<ButtonRelease-1>', lambda event, item_id=item_id: afficher_infos_completes(item_id))
|
||||||
|
|
||||||
|
except sqlite3.OperationalError as e:
|
||||||
|
print(f"Erreur SQL: {e}")
|
||||||
|
|
||||||
|
fenetre_info = None
|
||||||
|
|
||||||
|
|
||||||
|
# Fonction pour afficher les informations complètes lors du clic sur le bouton "+"
|
||||||
|
def afficher_infos_completes(item_id):
|
||||||
|
global fenetre_info
|
||||||
|
global nouvelles_valeurs_globale
|
||||||
|
|
||||||
|
nouvelles_valeurs_globale = None
|
||||||
|
|
||||||
|
if item_id not in treeview_recherches.get_children():
|
||||||
|
return
|
||||||
|
|
||||||
|
item_values = treeview_recherches.item(item_id, 'values')
|
||||||
|
|
||||||
|
# Affiche les informations complètes dans une nouvelle fenêtre
|
||||||
|
fenetre_info = Toplevel(fenetre)
|
||||||
|
fenetre_info.title("Informations Complètes")
|
||||||
|
nouvelles_valeurs = []
|
||||||
|
|
||||||
|
# Labels et Entry pour afficher et modifier les informations
|
||||||
|
for i, titre in enumerate(titres[:-1]):
|
||||||
|
label = Label(fenetre_info, text=f"{titre}:", anchor='w')
|
||||||
|
label.grid(row=i, column=0, sticky='w')
|
||||||
|
|
||||||
|
# Champ Entry pour modification
|
||||||
|
valeur_actuelle = item_values[i]
|
||||||
|
entry_modification = Entry(fenetre_info)
|
||||||
|
entry_modification.insert(END, valeur_actuelle)
|
||||||
|
entry_modification.grid(row=i, column=1, sticky='w')
|
||||||
|
|
||||||
|
nouvelles_valeurs.append(entry_modification)
|
||||||
|
|
||||||
|
# Bouton "Modifier"
|
||||||
|
Button(fenetre_info, text="Modifier", command=lambda item_id=item_id, valeurs=nouvelles_valeurs: modifier_recherche(item_id)).grid(row=len(titres)-1, column=0, sticky='w')
|
||||||
|
|
||||||
|
|
||||||
|
nouvelles_valeurs_globale = nouvelles_valeurs
|
||||||
|
|
||||||
|
# Fonction pour gérer la modification des informations
|
||||||
|
def modifier_recherche(item_id):
|
||||||
|
global nouvelles_valeurs_globale
|
||||||
|
|
||||||
|
item_id = int(item_id[1:])
|
||||||
|
|
||||||
|
# Vérifier si l'élément existe dans la liste des enfants
|
||||||
|
if item_id not in [int(treeview_recherches.item(child)['text'][1:]) for child in treeview_recherches.get_children()]:
|
||||||
|
messagebox.showerror("Erreur", "L'élément n'existe pas.")
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
cursor.execute('''
|
||||||
|
UPDATE recherches_stages
|
||||||
|
SET date_candidature=?, nom_societe=?, telephone=?, reponse_societe=?, lien_recrutement=?, cv_envoyes=?, lettre_envoyes=?
|
||||||
|
WHERE id=?
|
||||||
|
''', (
|
||||||
|
nouvelles_valeurs_globale[0].get(),
|
||||||
|
nouvelles_valeurs_globale[1].get(),
|
||||||
|
nouvelles_valeurs_globale[2].get(),
|
||||||
|
nouvelles_valeurs_globale[3].get(),
|
||||||
|
nouvelles_valeurs_globale[4].get(),
|
||||||
|
nouvelles_valeurs_globale[5].get(),
|
||||||
|
nouvelles_valeurs_globale[6].get() if len(nouvelles_valeurs_globale) > 5 else '',
|
||||||
|
item_id
|
||||||
|
))
|
||||||
|
conn.commit()
|
||||||
|
messagebox.showinfo("Succès", "Informations modifiées avec succès !")
|
||||||
|
except sqlite3.Error as e:
|
||||||
|
messagebox.showerror("Erreur", f"Erreur lors de la modification : {e}")
|
||||||
|
|
||||||
|
# Configure le bouton "+" pour chaque élément
|
||||||
|
for item_id in treeview_recherches.get_children():
|
||||||
|
treeview_recherches.item(item_id, tags=(item_id,)) # Associe l'identifiant de l'élément comme tag
|
||||||
|
treeview_recherches.tag_bind(item_id, '<ButtonRelease-1>', lambda event, item_id=item_id: afficher_infos_completes(item_id, originales_valeurs_globale))
|
||||||
|
|
||||||
|
# Fonction pour mettre à jour l'heure sur l'interface principale
|
||||||
|
def mettre_a_jour_heure():
|
||||||
|
heure_actuelle = datetime.now().strftime('%d-%m-%Y %H:%M')
|
||||||
|
label_heure.config(text=f"{heure_actuelle}")
|
||||||
|
fenetre.after(1000, mettre_a_jour_heure) # Mettre à jour l'heure chaque seconde
|
||||||
|
|
||||||
|
# Fonction pour afficher la fenêtre d'ajout de recherche
|
||||||
|
def afficher_fenetre_ajout_recherche():
|
||||||
|
fenetre_ajout = Toplevel(fenetre)
|
||||||
|
fenetre_ajout.title("Ajouter une recherche")
|
||||||
|
|
||||||
|
# Labels et Entry pour saisir les informations
|
||||||
|
|
||||||
|
Label(fenetre_ajout, text="Téléphone:").grid(row=3, column=0)
|
||||||
|
entry_telephone = Entry(fenetre_ajout)
|
||||||
|
entry_telephone.grid(row=3, column=1)
|
||||||
|
|
||||||
|
Label(fenetre_ajout, text="Nom de la Société:").grid(row=4, column=0)
|
||||||
|
entry_nom_societe_ajout = Entry(fenetre_ajout)
|
||||||
|
entry_nom_societe_ajout.grid(row=4, column=1)
|
||||||
|
|
||||||
|
Label(fenetre_ajout, text="Lien de Recrutement:").grid(row=5, column=0)
|
||||||
|
entry_lien_recrutement_ajout = Entry(fenetre_ajout)
|
||||||
|
entry_lien_recrutement_ajout.grid(row=5, column=1)
|
||||||
|
|
||||||
|
Label(fenetre_ajout, text="CV envoyés:").grid(row=1, column=0)
|
||||||
|
cv_var = IntVar()
|
||||||
|
Checkbutton(fenetre_ajout, variable=cv_var, text="Oui").grid(row=1, column=1)
|
||||||
|
|
||||||
|
Label(fenetre_ajout, text="Lettre envoyés:").grid(row=2, column=0)
|
||||||
|
lettre_var = IntVar()
|
||||||
|
Checkbutton(fenetre_ajout, variable=lettre_var, text="Oui").grid(row=2, column=1)
|
||||||
|
|
||||||
|
# Bouton pour ajouter la recherche depuis la fenêtre d'ajout
|
||||||
|
Button(fenetre_ajout, text="Enregistrer", command=lambda: ajouter_recherche_from_window(
|
||||||
|
fenetre_ajout,
|
||||||
|
entry_nom_societe_ajout.get(),
|
||||||
|
entry_telephone.get(),
|
||||||
|
entry_lien_recrutement_ajout.get(),
|
||||||
|
cv_var,
|
||||||
|
lettre_var
|
||||||
|
)).grid(row=7, column=0, columnspan=2)
|
||||||
|
|
||||||
|
# Fonction pour ajouter une recherche depuis la fenêtre d'ajout
|
||||||
|
def ajouter_recherche_from_window(fenetre_ajout, nom_societe, telephone, lien_recrutement, cv_var, lettre_var):
|
||||||
|
date_candidature = datetime.now().strftime('%d-%m-%Y %H:%M')
|
||||||
|
|
||||||
|
cv = "Oui" if cv_var.get() == 1 else "Non"
|
||||||
|
lettre = "Oui" if lettre_var.get() == 1 else "Non"
|
||||||
|
|
||||||
|
cursor.execute('''
|
||||||
|
INSERT INTO recherches_stages (date_candidature, nom_societe, telephone, reponse_societe, lien_recrutement, cv_envoyes, lettre_envoyes)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||||
|
''', (date_candidature, nom_societe, telephone, None, cv, lettre, lien_recrutement))
|
||||||
|
conn.commit()
|
||||||
|
messagebox.showinfo("Succès", "Recherche de stage ajoutée avec succès")
|
||||||
|
mettre_a_jour_treeview() # Mettre à jour la Treeview après l'ajout
|
||||||
|
fenetre_ajout.destroy() # Fermer la fenêtre d'ajout
|
||||||
|
|
||||||
|
# Création d'une base de données SQLite
|
||||||
|
conn = sqlite3.connect('recherches_stages.db')
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Création de la table si elle n'existe pas
|
||||||
|
cursor.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS recherches_stages (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
date_candidature TEXT,
|
||||||
|
nom_societe TEXT,
|
||||||
|
telephone TEXT,
|
||||||
|
reponse_societe TEXT,
|
||||||
|
lien_recrutement TEXT,
|
||||||
|
cv_envoyes TEXT,
|
||||||
|
lettre_envoyes TEXT
|
||||||
|
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
# Interface utilisateur avec Tkinter
|
||||||
|
fenetre = Tk()
|
||||||
|
fenetre.title("Gestion des Recherches de Stages")
|
||||||
|
|
||||||
|
# Label pour afficher l'heure actuelle
|
||||||
|
label_heure = Label(fenetre, text="", font=("Helvetica", 12))
|
||||||
|
label_heure.grid(row=7, column=0, columnspan=2)
|
||||||
|
mettre_a_jour_heure() # Appeler la fonction pour mettre à jour l'heure
|
||||||
|
|
||||||
|
# Labels et Entry pour saisir les informations
|
||||||
|
#Label(fenetre, text="Date de Candidature (DD-MM-YYYY):").grid(row=0, column=0)
|
||||||
|
#entry_date_candidature = Entry(fenetre)
|
||||||
|
#entry_date_candidature.grid(row=0, column=1)
|
||||||
|
|
||||||
|
|
||||||
|
# Listbox pour afficher les recherches sauvegardées
|
||||||
|
listbox_recherches = Listbox(fenetre, height=10, width=60)
|
||||||
|
listbox_recherches.grid(row=8, column=0, columnspan=2)
|
||||||
|
|
||||||
|
# Bouton pour ajouter une recherche
|
||||||
|
Button(fenetre, text="Ajouter une recherche", command=afficher_fenetre_ajout_recherche).grid(row=6, column=0, columnspan=2)
|
||||||
|
|
||||||
|
# Treeview pour afficher les recherches sauvegardées
|
||||||
|
treeview_recherches = ttk.Treeview(fenetre, height=10, columns=titres, show='headings')
|
||||||
|
treeview_recherches.grid(row=8, column=0, columnspan=2, sticky='nsew')
|
||||||
|
|
||||||
|
# Configuration de l'ascenseur vertical
|
||||||
|
scrollbar_vertical = ttk.Scrollbar(fenetre, orient="vertical", command=treeview_recherches.yview)
|
||||||
|
scrollbar_vertical.grid(row=8, column=2, sticky="ns")
|
||||||
|
treeview_recherches.configure(yscrollcommand=scrollbar_vertical.set)
|
||||||
|
|
||||||
|
# Configuration de l'ascenseur horizontal
|
||||||
|
scrollbar_horizontal = ttk.Scrollbar(fenetre, orient="horizontal", command=treeview_recherches.xview)
|
||||||
|
scrollbar_horizontal.grid(row=9, column=0, columnspan=2, sticky="ew")
|
||||||
|
treeview_recherches.configure(xscrollcommand=scrollbar_horizontal.set)
|
||||||
|
|
||||||
|
# Ajustement dynamique de la largeur des colonnes
|
||||||
|
for i, titre in enumerate(titres):
|
||||||
|
treeview_recherches.heading(titre, text=titre, anchor='center')
|
||||||
|
treeview_recherches.column(titre, anchor='center', width=150) # Ajustez la largeur selon vos besoins
|
||||||
|
|
||||||
|
mettre_a_jour_treeview()
|
||||||
|
|
||||||
|
if fenetre_info:
|
||||||
|
fenetre_info.destroy()
|
||||||
|
|
||||||
|
fenetre.mainloop()
|
||||||
|
|
||||||
|
# Fermer la connexion à la base de données
|
||||||
|
conn.close()
|
Binary file not shown.
Loading…
Reference in New Issue