|
- import PySimpleGUI as sg
- import sqlite3
-
- db = sqlite3.connect('ecole.sqlite3')
- cursor = db.cursor()
-
- # 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(?,?);"""
-
- UPDATE_STUDENT_BY_ID = """UPDATE eleves
- SET prenom=?, nom=?
- WHERE id_eleve=?;
- """
-
- cursor.execute(CREATE_TABLE)
-
-
- def make_main_window():
- cursor.execute(SELECT_ALL)
- liste_eleves = cursor.fetchall()
- col = [
- [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 = [
- [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)
- window.liste_eleves = liste_eleves
- return window
-
-
- 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 = [
- [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,
- layout=layout,
- finalize=True)
- window.role = role
- return window
-
-
-
- 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()
-
- 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()
- 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()
- 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 !')
|