#!/usr/bin/env python # -*- coding: utf-8 -*- import PySimpleGUI as sg import sqlite3 db = sqlite3.connect('ecole.sqlite3') cursor = db.cursor() cursor.execute("""PRAGMA foreign_keys=ON;""") cursor.execute("""CREATE TABLE IF NOT EXISTS localites( ID_Localite INTEGER PRIMARY KEY, "zipcode" TEXT, "localite" TEXT, "sous-commune" TEXT, "commune-principale" TEXT, "province" TEXT); """) cursor.execute("""CREATE TABLE IF NOT EXISTS eleves( ID_Eleve INTEGER PRIMARY KEY AUTOINCREMENT, Prenom TEXT, Nom TEXT, RefLocalite INTEGER, FOREIGN KEY(RefLocalite) REFERENCES localites(Id_Localite)); """) def select_all_eleves(): cursor.execute("""SELECT id_eleve, nom, prenom, ifnull(refLocalite, ''), ifnull(zipcode, '-'), ifnull(localite, '-') FROM eleves LEFT JOIN localites ON eleves.reflocalite=localites.id_localite ORDER BY nom, prenom; """) liste_eleves = cursor.fetchall() return liste_eleves def select_all_localites(): cursor.execute("""SELECT id_Localite, zipcode, localite FROM localites ORDER BY zipcode, localite; """) liste_localite = cursor.fetchall() return liste_localite liste_eleves = select_all_eleves() liste_localites = select_all_localites() liste_localites_combo = [f"{cp} {loc}" for _, cp, loc in liste_localites] 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=['', 'Prénom', 'Nom', '', 'Code postal', 'Localité'], max_col_width=25, col_widths=[0, 15, 15, 0, 10, 15], 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=(650, 500), finalize=True) return window def make_add_window(caption, role='create', initial_values=None, eleve_id=None): prenom, nom, id_localite, combo_value = ('','', '', '') 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.Text(text='Localité', size=(10,2)), sg.Combo(liste_localites_combo, size=(18,10), k='localite', enable_events=True, default_value=combo_value)], [sg.Button('Valider', bind_return_key=True), sg.Button('Annuler', bind_return_key=True)], [sg.InputText(default_text=id_localite, k="id_localite", visible=False)] ] window = sg.Window(caption, layout=layout, finalize=True) window.role = role window.eleve_id = eleve_id return window def main(): liste_eleves = select_all_eleves() liste_localites = select_all_localites() liste_localites_combo = [f"{cp} {loc}" for _, cp, loc in liste_localites] 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() liste_eleves = select_all_eleves() window1['table_eleves'].update(values=liste_eleves, num_rows=len(liste_eleves)) if event == 'Modifier': try: id_eleve, nom, prenom, refLocalite, zipcode, localite = 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, refLocalite, zipcode+" "+localite], role='modify', eleve_id=id_eleve) window2.make_modal() if window == window2: if event in (sg.WIN_CLOSED, 'Annuler'): window2.close() window2 = None if event == 'localite': index = liste_localites_combo.index(values['localite']) ID_Localite = liste_localites[index][0] window['id_localite'].update(ID_Localite) if window.role == 'create' and event == 'Valider': prenom = values['prenom'].capitalize() nom = values['nom'].upper() id_localite = values['id_localite'] # print(f"prenom : {prenom}, nom : {nom}") cursor.execute("""INSERT INTO eleves(prenom, nom, refLocalite) VALUES(?,?,?);""", (prenom, nom, id_localite)) db.commit() liste_eleves = select_all_eleves() 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() id_localite = values['id_localite'] # print(f"prenom : {prenom}, nom : {nom}") cursor.execute("""UPDATE eleves SET prenom=?, nom=?, refLocalite=? WHERE id_eleve=?; """, (prenom, nom, id_localite, window.eleve_id)) db.commit() liste_eleves = select_all_eleves() 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()