|
- #!/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()
|