diff --git a/encodage_eleves.py b/encodage_eleves.py new file mode 100755 index 0000000..87ea18a --- /dev/null +++ b/encodage_eleves.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sqlite3 +from utils import dessine_tableau + +def main(): + db = sqlite3.connect('ecole.sqlite3') + cursor = db.cursor() + + cursor.execute("""CREATE TABLE IF NOT EXISTS eleves( + ID_Eleve INTEGER PRIMARY KEY AUTOINCREMENT, + Prenom TEXT, + Nom TEXT); + """) + + while True: + choix = input("\nVeuillez choisir une action à réaliser [A]jouter, [L]ister, " \ + "[M]odifier, [S]upprimer, [Q]uitter : ") + + if choix == "": + continue + + if choix[0] in 'lL': + cursor.execute("""SELECT * FROM eleves ORDER BY ID_eleve;""") + liste_eleves = cursor.fetchall() + titres = ['Id', 'Prénom', 'Nom'] + dessine_tableau(liste_eleves, titres) + + if choix[0] in 'aA': + prenom = input("\nVeuillez entrer un prenom : ").capitalize() + nom = input("Veuillez entrer un nom : ").upper() + cursor.execute("""SELECT prenom, nom FROM eleves;""") + liste_eleves = cursor.fetchall() + if (prenom, nom) in liste_eleves: + print('Cet élève existe déjà !') + elif prenom=="" or nom=="": + print('Vous devez renseigner le nom et le prénom') + else: + cursor.execute("""INSERT INTO eleves(prenom, nom) + VALUES(?,?);""", + (prenom, nom)) + db.commit() + + if choix[0] in 'mM': + id_eleve = input("Veuillez entrez l'identifiant de l'élève à modifier : ") + cursor.execute("""SELECT prenom, nom FROM eleves WHERE ID_Eleve=?""", (id_eleve,)) + prenom, nom = cursor.fetchone() + n_prenom = input(f"\nVeuillez entrer un prenom (actuellement {prenom}): ") + n_nom = input(f"Veuillez entrer un nom (actuellement {nom}): ") + if n_prenom: + prenom = n_prenom + if n_nom: + nom = n_nom + cursor.execute("""UPDATE eleves + SET prenom=?, + nom=? + WHERE ID_Eleve=?;""", + (prenom.capitalize(), nom.upper(), id_eleve)) + db.commit() + + if choix[0] in 'sS': + id_eleve = input("Veuillez entrez l'identifiant de l'élève à supprimer : ") + cursor.execute("""SELECT prenom, nom FROM eleves WHERE ID_Eleve=?""", (id_eleve,)) + prenom, nom = cursor.fetchone() + confirmation = input(f"Confirmez-vous la suppression de {prenom} {nom} ? [O/n] : ") + if not confirmation=='n': + cursor.execute("""DELETE FROM eleves WHERE ID_Eleve=?""",(id_eleve,)) + db.commit() + + if choix[0] in 'qQ': + break + + print('Bye !') + db.close() + +if __name__ == '__main__': + main() diff --git a/formulaire.py b/formulaire.py new file mode 100755 index 0000000..381db71 --- /dev/null +++ b/formulaire.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import PySimpleGUI as sg +import sqlite3 + +db = sqlite3.connect('ecole.sqlite3') +cursor = db.cursor() + +cursor.execute("""CREATE TABLE IF NOT EXISTS eleves( + ID_Eleve INTEGER PRIMARY KEY AUTOINCREMENT, + Prenom TEXT, + Nom TEXT); + """) +cursor.execute("""SELECT id_eleve, nom, prenom + FROM eleves + ORDER BY nom, prenom; + """) +liste_eleves = cursor.fetchall() + +def make_main_window(): + col = [ + [sg.Button('Ajouter', size=(10, 1), bind_return_key=True)], + [sg.Button('Modifier', size=(10, 1))], + [sg.Button('Supprimer', size=(10, 1))], + [sg.Button('Quitter', size=(10, 1))], + ] + layout = [ + [sg.Text('Liste des élèves')], + [sg.Table(values=liste_eleves, + headings=['Id', 'Prénom', 'Nom'], + max_col_width=25, + col_widths=[0, 20, 20], + hide_vertical_scroll=True, + background_color='light blue', + text_color='black', + auto_size_columns=False, + justification='right', + num_rows=len(liste_eleves), + alternating_row_color='lightyellow', + key='table_eleves', + tooltip='Liste des élèves'), sg.Column(col)], + ] + window = sg.Window('Formulaire', + layout=layout, + size=(500, 500), + finalize=True) + return window + + +def make_add_window(caption, + role='create', + initial_values=None, + eleve_id=None): + prenom, nom = ('','') if not initial_values else initial_values + layout = [ + [sg.Text(text='Prénom', size=(10,2)), + sg.InputText(default_text=prenom, + size=(20,2), + k='prenom')], + [sg.Text(text='Nom', size=(10,2)), + sg.InputText(default_text=nom, + size=(20,2), + k='nom')], + [sg.Button('Valider', bind_return_key=True), + sg.Button('Annuler', bind_return_key=True)] + ] + window = sg.Window(caption, + layout=layout, + finalize=True) + window.role = role + window.eleve_id = eleve_id + return window + + +def main(): + window1, window2 = make_main_window(), None + + while True: + window, event, values = sg.read_all_windows() + # print(f'window : {window}, event : {event}, values : {values}') + if window == window1: + if event in (sg.WIN_CLOSED, 'Quitter'): + break + + if event == 'Ajouter': + window2 = make_add_window('Ajouter', role='create') + window2.make_modal() + + if event == 'Supprimer': + try: + id_eleve = liste_eleves[values['table_eleves'][0]][0] + except IndexError: + sg.popup_ok('Veuillez sélectionner un enregistrement à supprimer') + continue + confirmation = sg.popup("Confirmez-vous la suppression ?", + button_type=sg.POPUP_BUTTONS_OK_CANCEL, + custom_text=("Oui", "Non")) + if confirmation=="Non": + continue + cursor.execute("""DELETE FROM eleves WHERE ID_Eleve=?""",(id_eleve,)) + db.commit() + cursor.execute("""SELECT id_eleve, nom, prenom + FROM eleves + ORDER BY nom, prenom; + """) + liste_eleves = cursor.fetchall() + window1['table_eleves'].update(values=liste_eleves, + num_rows=len(liste_eleves)) + + if event == 'Modifier': + try: + id_eleve, nom, prenom = liste_eleves[values['table_eleves'][0]] + except IndexError: + sg.popup_ok('Veuillez sélectionner un enregistrement à modifier') + continue + window2 = make_add_window('Modifier', + initial_values=[prenom, nom], + role='modify', + eleve_id=id_eleve) + window2.make_modal() + + if window == window2: + if event in (sg.WIN_CLOSED, 'Annuler'): + window2.close() + window2 = None + + if window.role == 'create' and event == 'Valider': + prenom = values['prenom'].capitalize() + nom = values['nom'].upper() + # print(f"prenom : {prenom}, nom : {nom}") + cursor.execute("""INSERT INTO eleves(prenom, nom) + VALUES(?,?);""", (prenom, nom)) + db.commit() + cursor.execute("""SELECT id_eleve, nom, prenom + FROM eleves + ORDER BY nom, prenom; + """) + liste_eleves = cursor.fetchall() + window1['table_eleves'].update(values=liste_eleves, num_rows=len(liste_eleves)) + window2.close() + window2 = None + + if window.role == 'modify' and event == 'Valider': + confirmation = sg.popup("Confirmez-vous la modification ?", + button_type=sg.POPUP_BUTTONS_OK_CANCEL, + custom_text=("Oui", "Non")) + if confirmation=="Non": + continue + prenom = values['prenom'].capitalize() + nom = values['nom'].upper() + # print(f"prenom : {prenom}, nom : {nom}") + cursor.execute("""UPDATE eleves + SET prenom=?, + nom=? + WHERE id_eleve=?; + """, (prenom, nom, window.eleve_id)) + db.commit() + cursor.execute("""SELECT id_eleve, nom, prenom + FROM eleves + ORDER BY nom, prenom; + """) + liste_eleves = cursor.fetchall() + window1['table_eleves'].update(values=liste_eleves, + num_rows=len(liste_eleves)) + window2.close() + window2 = None + + window1.close() + if window2 is not None: + window2.close() + + db.close() + print('Bye !') + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..224e27d --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +PySimpleGUI==4.32.1 diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..c37df9c --- /dev/null +++ b/utils.py @@ -0,0 +1,45 @@ +def dessine_tableau(tableau, titres=None): + lengths = [] + if titres: + tableau.insert(0, titres) + nb_columns = len(tableau[0]) + nb_rows = len(tableau) + for i in range(nb_columns): + lengths.append(max([len(str(x[i])) for x in tableau])) + + print('╭', end='') + for col in range(nb_columns): + print('─'*lengths[col], end='') + if not col+1==nb_columns: + print('┬', end='') + print('╮') + + if titres: + print('│', end='') + for col, cell in enumerate(tableau[0]): + width = lengths[col] + print(f"{cell: <{width}}", end='│') + print() + print('┝', end='') + for col in range(nb_columns): + print('━'*lengths[col], end='') + if not col+1==nb_columns: + print('┿', end='') + else: + print('┥') + + starting_row = 1 if titres else 0 + for row in tableau[starting_row:]: + if row: + print('│', end='') + for col, cell in enumerate(row): + width = lengths[col] + print(f"{cell: <{width}}", end='│') + print() + + print('╰', end='') + for col in range(nb_columns): + print('─'*lengths[col], end='') + if not col+1==nb_columns: + print('┴', end='') + print('╯')