Démonstration de l'usage de l'API Sqlite3 pour encoder des élèves.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

213 рядки
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()