Démonstration de l'usage de l'API Sqlite3 pour encoder des élèves.1er essai
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.

177 lignes
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()