Démonstration de l'usage de l'API Sqlite3 pour encoder des élèves.1er essai
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

186 rader
6.7 KiB

  1. import PySimpleGUI as sg
  2. import sqlite3
  3. db = sqlite3.connect('ecole.sqlite3')
  4. cursor = db.cursor()
  5. # Instructions SQL
  6. CREATE_TABLE = """CREATE TABLE IF NOT EXISTS eleves(
  7. ID_Eleve INTEGER PRIMARY KEY,
  8. Prenom TEXT,
  9. Nom TEXT,
  10. UNIQUE (Prenom, Nom));
  11. """
  12. SELECT_ALL = """SELECT id_eleve, nom, prenom
  13. FROM eleves
  14. ORDER BY nom, prenom;
  15. """
  16. DELETE_BY_ID = """DELETE FROM eleves
  17. WHERE ID_Eleve=?;
  18. """
  19. INSERT_STUDENT = """INSERT INTO eleves(prenom, nom)
  20. VALUES(?,?);"""
  21. UPDATE_STUDENT_BY_ID = """UPDATE eleves
  22. SET prenom=?, nom=?
  23. WHERE id_eleve=?;
  24. """
  25. cursor.execute(CREATE_TABLE)
  26. def make_main_window():
  27. cursor.execute(SELECT_ALL)
  28. liste_eleves = cursor.fetchall()
  29. col = [
  30. [sg.Button('Ajouter', size=(12, 1))],
  31. [sg.Button('Modifier', size=(12, 1))],
  32. [sg.Button('Supprimer', size=(12, 1))],
  33. [sg.Button('Quitter', size=(12, 1))],
  34. ]
  35. layout = [
  36. [sg.Text('Liste des élèves')],
  37. [sg.Table(values=liste_eleves,
  38. headings=['Id', 'Prénom', 'Nom'],
  39. max_col_width=25,
  40. col_widths=[0, 20, 20],
  41. hide_vertical_scroll=True,
  42. background_color='light blue',
  43. text_color='black',
  44. auto_size_columns=False,
  45. justification='right',
  46. num_rows=len(liste_eleves),
  47. alternating_row_color='lightyellow',
  48. key='table_eleves',
  49. tooltip='Liste des élèves'), sg.Column(col)],
  50. ]
  51. window = sg.Window('Formulaire',
  52. layout=layout,
  53. size=(500, 500),
  54. finalize=True)
  55. window.liste_eleves = liste_eleves
  56. return window
  57. def make_add_window(caption, role='create', initial_values=None):
  58. if initial_values:
  59. eleve_id, prenom, nom = initial_values
  60. else:
  61. eleve_id = prenom = nom = ''
  62. layout = [
  63. [sg.InputText(eleve_id, k='eleve_id', visible=False)],
  64. [sg.Text(text='Prénom', size=(10,2)), sg.InputText(default_text=prenom, size=(20,2), k='prenom')],
  65. [sg.Text(text='Nom', size=(10,2)), sg.InputText(default_text=nom, size=(20,2), k='nom')],
  66. [sg.Button('Valider', bind_return_key=True), sg.Button('Annuler', bind_return_key=True)]
  67. ]
  68. window = sg.Window(caption,
  69. layout=layout,
  70. finalize=True)
  71. window.role = role
  72. return window
  73. window1, window2 = make_main_window(), None
  74. while True:
  75. window, event, values = sg.read_all_windows()
  76. # print(f'window : {window}, event : {event}, values : {values}')
  77. if window == window1:
  78. if event in (sg.WIN_CLOSED, 'Quitter'):
  79. break
  80. if event == 'Ajouter':
  81. window2 = make_add_window('Ajouter', role='create')
  82. window2.make_modal()
  83. if event == 'Supprimer':
  84. try:
  85. # dans le cas d'un tableau, la valeur est un tableau de(s)
  86. # index sélectionnés. On garde le premier quoi qu'il arrive
  87. selected_line = values['table_eleves'][0]
  88. # la colonne id est cachée au niveau de l'affichage
  89. id_eleve = window1.liste_eleves[selected_line][0]
  90. except IndexError:
  91. sg.popup_ok('Veuillez sélectionner un enregistrement à supprimer')
  92. continue
  93. confirmation = sg.popup("Confirmez-vous la suppression ?",
  94. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  95. custom_text=("Oui", "Non"))
  96. if confirmation=="Non":
  97. continue
  98. cursor.execute(DELETE_BY_ID, (id_eleve,))
  99. db.commit()
  100. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  101. window1['table_eleves'].update(values=liste_eleves,
  102. num_rows=len(liste_eleves))
  103. # On ne peut pas retrouver la liste des élèves à partir du tableau;
  104. # alors on l'attache à la window1
  105. window1.liste_eleves = liste_eleves
  106. if event == 'Modifier':
  107. try:
  108. # voir 'Supprimer' pour une explication
  109. selected_line = values['table_eleves'][0]
  110. id_eleve, nom, prenom = window1.liste_eleves[selected_line]
  111. except IndexError:
  112. sg.popup_ok('Veuillez sélectionner un enregistrement à modifier')
  113. continue
  114. window2 = make_add_window('Modifier',
  115. initial_values=[id_eleve, prenom, nom],
  116. role='modify')
  117. window2.make_modal()
  118. if window == window2:
  119. if event in (sg.WIN_CLOSED, 'Annuler'):
  120. window2.close()
  121. window2 = None
  122. if event == 'Valider' and window.role == 'create' :
  123. prenom = values['prenom'].capitalize()
  124. nom = values['nom'].upper()
  125. try:
  126. cursor.execute(INSERT_STUDENT, (prenom, nom))
  127. db.commit()
  128. except sqlite3.IntegrityError:
  129. sg.popup_error('Cet élève existe déjà dans la base de données')
  130. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  131. window1['table_eleves'].update(values=liste_eleves,
  132. num_rows=len(liste_eleves))
  133. window1.liste_eleves = liste_eleves
  134. window2.close()
  135. window2 = None
  136. if event == 'Valider' and window.role == 'modify':
  137. confirmation = sg.popup("Confirmez-vous la modification ?",
  138. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  139. custom_text=("Oui", "Non"))
  140. if confirmation=="Non":
  141. continue
  142. prenom = values['prenom'].capitalize()
  143. nom = values['nom'].upper()
  144. eleve_id = values['eleve_id']
  145. try:
  146. cursor.execute(UPDATE_STUDENT_BY_ID, (prenom, nom, eleve_id))
  147. db.commit()
  148. except sqlite3.IntegrityError:
  149. sg.popup_error('Cet élève existe déjà dans la base de données')
  150. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  151. window1['table_eleves'].update(values=liste_eleves,
  152. num_rows=len(liste_eleves))
  153. window1.liste_eleves = liste_eleves
  154. window2.close()
  155. window2 = None
  156. window1.close()
  157. if window2 is not None:
  158. window2.close()
  159. db.close()
  160. print('Bye !')