Démonstration de l'usage de l'API Sqlite3 pour encoder des élèves.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

213 lignes
8.3 KiB

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import PySimpleGUI as sg
  4. import sqlite3
  5. db = sqlite3.connect('ecole.sqlite3')
  6. cursor = db.cursor()
  7. cursor.execute("""PRAGMA foreign_keys=ON;""")
  8. cursor.execute("""CREATE TABLE IF NOT EXISTS localites(
  9. ID_Localite INTEGER PRIMARY KEY,
  10. "zipcode" TEXT,
  11. "localite" TEXT,
  12. "sous-commune" TEXT,
  13. "commune-principale" TEXT,
  14. "province" TEXT);
  15. """)
  16. cursor.execute("""CREATE TABLE IF NOT EXISTS eleves(
  17. ID_Eleve INTEGER PRIMARY KEY AUTOINCREMENT,
  18. Prenom TEXT,
  19. Nom TEXT,
  20. RefLocalite INTEGER,
  21. FOREIGN KEY(RefLocalite) REFERENCES localites(Id_Localite));
  22. """)
  23. def select_all_eleves():
  24. cursor.execute("""SELECT id_eleve, nom, prenom, ifnull(refLocalite, ''), ifnull(zipcode, '-'), ifnull(localite, '-')
  25. FROM eleves
  26. LEFT JOIN localites
  27. ON eleves.reflocalite=localites.id_localite
  28. ORDER BY nom, prenom;
  29. """)
  30. liste_eleves = cursor.fetchall()
  31. return liste_eleves
  32. def select_all_localites():
  33. cursor.execute("""SELECT id_Localite, zipcode, localite
  34. FROM localites
  35. ORDER BY zipcode, localite;
  36. """)
  37. liste_localite = cursor.fetchall()
  38. return liste_localite
  39. liste_eleves = select_all_eleves()
  40. liste_localites = select_all_localites()
  41. liste_localites_combo = [f"{cp} {loc}" for _, cp, loc in liste_localites]
  42. def make_main_window():
  43. col = [
  44. [sg.Button('Ajouter', size=(10, 1), bind_return_key=True)],
  45. [sg.Button('Modifier', size=(10, 1))],
  46. [sg.Button('Supprimer', size=(10, 1))],
  47. [sg.Button('Quitter', size=(10, 1))],
  48. ]
  49. layout = [
  50. [sg.Text('Liste des élèves')],
  51. [sg.Table(values=liste_eleves,
  52. headings=['', 'Prénom', 'Nom', '', 'Code postal', 'Localité'],
  53. max_col_width=25,
  54. col_widths=[0, 15, 15, 0, 10, 15],
  55. hide_vertical_scroll=True,
  56. background_color='light blue',
  57. text_color='black',
  58. auto_size_columns=False,
  59. justification='right',
  60. num_rows=len(liste_eleves),
  61. alternating_row_color='lightyellow',
  62. key='table_eleves',
  63. tooltip='Liste des élèves'), sg.Column(col)],
  64. ]
  65. window = sg.Window('Formulaire',
  66. layout=layout,
  67. size=(650, 500),
  68. finalize=True)
  69. return window
  70. def make_add_window(caption,
  71. role='create',
  72. initial_values=None,
  73. eleve_id=None):
  74. prenom, nom, id_localite, combo_value = ('','', '', '') if not initial_values else initial_values
  75. layout = [
  76. [sg.Text(text='Prénom', size=(10,2)),
  77. sg.InputText(default_text=prenom,
  78. size=(20,2),
  79. k='prenom')],
  80. [sg.Text(text='Nom', size=(10,2)),
  81. sg.InputText(default_text=nom,
  82. size=(20,2),
  83. k='nom')],
  84. [sg.Text(text='Localité', size=(10,2)),
  85. sg.Combo(liste_localites_combo,
  86. size=(18,10),
  87. k='localite',
  88. enable_events=True,
  89. default_value=combo_value)],
  90. [sg.Button('Valider', bind_return_key=True),
  91. sg.Button('Annuler', bind_return_key=True)],
  92. [sg.InputText(default_text=id_localite, k="id_localite", visible=False)]
  93. ]
  94. window = sg.Window(caption,
  95. layout=layout,
  96. finalize=True)
  97. window.role = role
  98. window.eleve_id = eleve_id
  99. return window
  100. def main():
  101. liste_eleves = select_all_eleves()
  102. liste_localites = select_all_localites()
  103. liste_localites_combo = [f"{cp} {loc}" for _, cp, loc in liste_localites]
  104. window1, window2 = make_main_window(), None
  105. while True:
  106. window, event, values = sg.read_all_windows()
  107. print(f'window : {window}, event : {event}, values : {values}')
  108. if window == window1:
  109. if event in (sg.WIN_CLOSED, 'Quitter'):
  110. break
  111. if event == 'Ajouter':
  112. window2 = make_add_window('Ajouter', role='create')
  113. window2.make_modal()
  114. if event == 'Supprimer':
  115. try:
  116. id_eleve = liste_eleves[values['table_eleves'][0]][0]
  117. except IndexError:
  118. sg.popup_ok('Veuillez sélectionner un enregistrement à supprimer')
  119. continue
  120. confirmation = sg.popup("Confirmez-vous la suppression ?",
  121. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  122. custom_text=("Oui", "Non"))
  123. if confirmation=="Non":
  124. continue
  125. cursor.execute("""DELETE FROM eleves WHERE ID_Eleve=?""",(id_eleve,))
  126. db.commit()
  127. liste_eleves = select_all_eleves()
  128. window1['table_eleves'].update(values=liste_eleves,
  129. num_rows=len(liste_eleves))
  130. if event == 'Modifier':
  131. try:
  132. id_eleve, nom, prenom, refLocalite, zipcode, localite = liste_eleves[values['table_eleves'][0]]
  133. except IndexError:
  134. sg.popup_ok('Veuillez sélectionner un enregistrement à modifier')
  135. continue
  136. window2 = make_add_window('Modifier',
  137. initial_values=[prenom, nom, refLocalite, zipcode+" "+localite],
  138. role='modify',
  139. eleve_id=id_eleve)
  140. window2.make_modal()
  141. if window == window2:
  142. if event in (sg.WIN_CLOSED, 'Annuler'):
  143. window2.close()
  144. window2 = None
  145. if event == 'localite':
  146. index = liste_localites_combo.index(values['localite'])
  147. ID_Localite = liste_localites[index][0]
  148. window['id_localite'].update(ID_Localite)
  149. if window.role == 'create' and event == 'Valider':
  150. prenom = values['prenom'].capitalize()
  151. nom = values['nom'].upper()
  152. id_localite = values['id_localite']
  153. # print(f"prenom : {prenom}, nom : {nom}")
  154. cursor.execute("""INSERT INTO eleves(prenom, nom, refLocalite)
  155. VALUES(?,?,?);""", (prenom, nom, id_localite))
  156. db.commit()
  157. liste_eleves = select_all_eleves()
  158. window1['table_eleves'].update(values=liste_eleves, num_rows=len(liste_eleves))
  159. window2.close()
  160. window2 = None
  161. if window.role == 'modify' and event == 'Valider':
  162. confirmation = sg.popup("Confirmez-vous la modification ?",
  163. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  164. custom_text=("Oui", "Non"))
  165. if confirmation=="Non":
  166. continue
  167. prenom = values['prenom'].capitalize()
  168. nom = values['nom'].upper()
  169. id_localite = values['id_localite']
  170. # print(f"prenom : {prenom}, nom : {nom}")
  171. cursor.execute("""UPDATE eleves
  172. SET prenom=?,
  173. nom=?,
  174. refLocalite=?
  175. WHERE id_eleve=?;
  176. """, (prenom, nom, id_localite, window.eleve_id))
  177. db.commit()
  178. liste_eleves = select_all_eleves()
  179. window1['table_eleves'].update(values=liste_eleves,
  180. num_rows=len(liste_eleves))
  181. window2.close()
  182. window2 = None
  183. window1.close()
  184. if window2 is not None:
  185. window2.close()
  186. db.close()
  187. print('Bye !')
  188. if __name__ == "__main__":
  189. main()