Démonstration de l'usage de l'API Sqlite3 pour encoder des élèves.1er essai
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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