|
@@ -1,65 +1,52 @@ |
|
|
#!/usr/bin/env python |
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
|
|
|
|
|
|
import PySimpleGUI as sg |
|
|
import PySimpleGUI as sg |
|
|
import sqlite3 |
|
|
import sqlite3 |
|
|
|
|
|
|
|
|
db = sqlite3.connect('ecole.sqlite3') |
|
|
db = sqlite3.connect('ecole.sqlite3') |
|
|
cursor = db.cursor() |
|
|
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 |
|
|
|
|
|
|
|
|
# Instructions SQL |
|
|
|
|
|
CREATE_TABLE = """CREATE TABLE IF NOT EXISTS eleves( |
|
|
|
|
|
ID_Eleve INTEGER PRIMARY KEY, |
|
|
|
|
|
Prenom TEXT, |
|
|
|
|
|
Nom TEXT, |
|
|
|
|
|
UNIQUE (Prenom, Nom)); |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
SELECT_ALL = """SELECT id_eleve, nom, prenom |
|
|
|
|
|
FROM eleves |
|
|
|
|
|
ORDER BY nom, prenom; |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
DELETE_BY_ID = """DELETE FROM eleves |
|
|
|
|
|
WHERE ID_Eleve=?; |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
INSERT_STUDENT = """INSERT INTO eleves(prenom, nom) |
|
|
|
|
|
VALUES(?,?);""" |
|
|
|
|
|
|
|
|
def select_all_localites(): |
|
|
|
|
|
cursor.execute("""SELECT id_Localite, zipcode, localite |
|
|
|
|
|
FROM localites |
|
|
|
|
|
ORDER BY zipcode, localite; |
|
|
|
|
|
""") |
|
|
|
|
|
liste_localite = cursor.fetchall() |
|
|
|
|
|
return liste_localite |
|
|
|
|
|
|
|
|
UPDATE_STUDENT_BY_ID = """UPDATE eleves |
|
|
|
|
|
SET prenom=?, nom=? |
|
|
|
|
|
WHERE id_eleve=?; |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
cursor.execute(CREATE_TABLE) |
|
|
|
|
|
|
|
|
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(): |
|
|
def make_main_window(): |
|
|
|
|
|
cursor.execute(SELECT_ALL) |
|
|
|
|
|
liste_eleves = cursor.fetchall() |
|
|
col = [ |
|
|
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))], |
|
|
|
|
|
|
|
|
[sg.Button('Ajouter', size=(12, 1))], |
|
|
|
|
|
[sg.Button('Modifier', size=(12, 1))], |
|
|
|
|
|
[sg.Button('Supprimer', size=(12, 1))], |
|
|
|
|
|
[sg.Button('Quitter', size=(12, 1))], |
|
|
] |
|
|
] |
|
|
layout = [ |
|
|
layout = [ |
|
|
[sg.Text('Liste des élèves')], |
|
|
[sg.Text('Liste des élèves')], |
|
|
[sg.Table(values=liste_eleves, |
|
|
[sg.Table(values=liste_eleves, |
|
|
headings=['', 'Prénom', 'Nom', '', 'Code postal', 'Localité'], |
|
|
|
|
|
|
|
|
headings=['Id', 'Prénom', 'Nom'], |
|
|
max_col_width=25, |
|
|
max_col_width=25, |
|
|
col_widths=[0, 15, 15, 0, 10, 15], |
|
|
|
|
|
|
|
|
col_widths=[0, 20, 20], |
|
|
hide_vertical_scroll=True, |
|
|
hide_vertical_scroll=True, |
|
|
background_color='light blue', |
|
|
background_color='light blue', |
|
|
text_color='black', |
|
|
text_color='black', |
|
@@ -72,142 +59,128 @@ def make_main_window(): |
|
|
] |
|
|
] |
|
|
window = sg.Window('Formulaire', |
|
|
window = sg.Window('Formulaire', |
|
|
layout=layout, |
|
|
layout=layout, |
|
|
size=(650, 500), |
|
|
|
|
|
|
|
|
size=(500, 500), |
|
|
finalize=True) |
|
|
finalize=True) |
|
|
|
|
|
window.liste_eleves = liste_eleves |
|
|
return window |
|
|
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 |
|
|
|
|
|
|
|
|
def make_add_window(caption, role='create', initial_values=None): |
|
|
|
|
|
if initial_values: |
|
|
|
|
|
eleve_id, prenom, nom = initial_values |
|
|
|
|
|
else: |
|
|
|
|
|
eleve_id = prenom = nom = '' |
|
|
layout = [ |
|
|
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)] |
|
|
|
|
|
|
|
|
[sg.InputText(eleve_id, k='eleve_id', visible=False)], |
|
|
|
|
|
[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, |
|
|
window = sg.Window(caption, |
|
|
layout=layout, |
|
|
layout=layout, |
|
|
finalize=True) |
|
|
finalize=True) |
|
|
window.role = role |
|
|
window.role = role |
|
|
window.eleve_id = eleve_id |
|
|
|
|
|
return window |
|
|
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 |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
# dans le cas d'un tableau, la valeur est un tableau de(s) |
|
|
|
|
|
# index sélectionnés. On garde le premier quoi qu'il arrive |
|
|
|
|
|
selected_line = values['table_eleves'][0] |
|
|
|
|
|
# la colonne id est cachée au niveau de l'affichage |
|
|
|
|
|
id_eleve = window1.liste_eleves[selected_line][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_BY_ID, (id_eleve,)) |
|
|
|
|
|
db.commit() |
|
|
|
|
|
|
|
|
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)) |
|
|
|
|
|
|
|
|
liste_eleves = cursor.execute(SELECT_ALL).fetchall() |
|
|
|
|
|
window1['table_eleves'].update(values=liste_eleves, |
|
|
|
|
|
num_rows=len(liste_eleves)) |
|
|
|
|
|
# On ne peut pas retrouver la liste des élèves à partir du tableau; |
|
|
|
|
|
# alors on l'attache à la window1 |
|
|
|
|
|
window1.liste_eleves = liste_eleves |
|
|
|
|
|
|
|
|
|
|
|
if event == 'Modifier': |
|
|
|
|
|
try: |
|
|
|
|
|
# voir 'Supprimer' pour une explication |
|
|
|
|
|
selected_line = values['table_eleves'][0] |
|
|
|
|
|
id_eleve, nom, prenom = window1.liste_eleves[selected_line] |
|
|
|
|
|
except IndexError: |
|
|
|
|
|
sg.popup_ok('Veuillez sélectionner un enregistrement à modifier') |
|
|
|
|
|
continue |
|
|
|
|
|
window2 = make_add_window('Modifier', |
|
|
|
|
|
initial_values=[id_eleve, prenom, nom], |
|
|
|
|
|
role='modify') |
|
|
|
|
|
window2.make_modal() |
|
|
|
|
|
|
|
|
|
|
|
if window == window2: |
|
|
|
|
|
if event in (sg.WIN_CLOSED, 'Annuler'): |
|
|
|
|
|
window2.close() |
|
|
|
|
|
window2 = None |
|
|
|
|
|
|
|
|
|
|
|
if event == 'Valider' and window.role == 'create' : |
|
|
|
|
|
prenom = values['prenom'].capitalize() |
|
|
|
|
|
nom = values['nom'].upper() |
|
|
|
|
|
try: |
|
|
|
|
|
cursor.execute(INSERT_STUDENT, (prenom, nom)) |
|
|
db.commit() |
|
|
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)) |
|
|
|
|
|
|
|
|
except sqlite3.IntegrityError: |
|
|
|
|
|
sg.popup_error('Cet élève existe déjà dans la base de données') |
|
|
|
|
|
|
|
|
|
|
|
liste_eleves = cursor.execute(SELECT_ALL).fetchall() |
|
|
|
|
|
window1['table_eleves'].update(values=liste_eleves, |
|
|
|
|
|
num_rows=len(liste_eleves)) |
|
|
|
|
|
window1.liste_eleves = liste_eleves |
|
|
|
|
|
window2.close() |
|
|
|
|
|
window2 = None |
|
|
|
|
|
|
|
|
|
|
|
if event == 'Valider' and window.role == 'modify': |
|
|
|
|
|
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() |
|
|
|
|
|
eleve_id = values['eleve_id'] |
|
|
|
|
|
try: |
|
|
|
|
|
cursor.execute(UPDATE_STUDENT_BY_ID, (prenom, nom, eleve_id)) |
|
|
db.commit() |
|
|
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() |
|
|
|
|
|
|
|
|
except sqlite3.IntegrityError: |
|
|
|
|
|
sg.popup_error('Cet élève existe déjà dans la base de données') |
|
|
|
|
|
|
|
|
|
|
|
liste_eleves = cursor.execute(SELECT_ALL).fetchall() |
|
|
|
|
|
window1['table_eleves'].update(values=liste_eleves, |
|
|
|
|
|
num_rows=len(liste_eleves)) |
|
|
|
|
|
window1.liste_eleves = liste_eleves |
|
|
|
|
|
window2.close() |
|
|
|
|
|
window2 = None |
|
|
|
|
|
|
|
|
|
|
|
window1.close() |
|
|
|
|
|
if window2 is not None: |
|
|
|
|
|
window2.close() |
|
|
|
|
|
|
|
|
|
|
|
db.close() |
|
|
|
|
|
print('Bye !') |