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.

formulaire.py 8.2 KiB

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