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

3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
3 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import PySimpleGUI as sg
  2. import sqlite3
  3. db = sqlite3.connect('ecole.sqlite3')
  4. cursor = db.cursor()
  5. # Instructions SQL
  6. CREATE_TABLE = """CREATE TABLE IF NOT EXISTS eleves(
  7. ID_Eleve INTEGER PRIMARY KEY,
  8. Prenom TEXT,
  9. Nom TEXT,
  10. UNIQUE (Prenom, Nom));
  11. """
  12. SELECT_ALL = """SELECT id_eleve, nom, prenom
  13. FROM eleves
  14. ORDER BY nom, prenom;
  15. """
  16. DELETE_BY_ID = """DELETE FROM eleves
  17. WHERE ID_Eleve=?;
  18. """
  19. INSERT_STUDENT = """INSERT INTO eleves(prenom, nom)
  20. VALUES(?,?);"""
  21. UPDATE_STUDENT_BY_ID = """UPDATE eleves
  22. SET prenom=?, nom=?
  23. WHERE id_eleve=?;
  24. """
  25. cursor.execute(CREATE_TABLE)
  26. def make_main_window():
  27. cursor.execute(SELECT_ALL)
  28. liste_eleves = cursor.fetchall()
  29. col = [
  30. [sg.Button('Ajouter', size=(12, 1))],
  31. [sg.Button('Modifier', size=(12, 1))],
  32. [sg.Button('Supprimer', size=(12, 1))],
  33. [sg.Button('Quitter', size=(12, 1))],
  34. ]
  35. layout = [
  36. [sg.Text('Liste des élèves')],
  37. [sg.Table(values=liste_eleves,
  38. headings=['Id', 'Prénom', 'Nom'],
  39. max_col_width=25,
  40. col_widths=[0, 20, 20],
  41. hide_vertical_scroll=True,
  42. background_color='light blue',
  43. text_color='black',
  44. auto_size_columns=False,
  45. justification='right',
  46. num_rows=len(liste_eleves),
  47. alternating_row_color='lightyellow',
  48. key='table_eleves',
  49. tooltip='Liste des élèves'), sg.Column(col)],
  50. ]
  51. window = sg.Window('Formulaire',
  52. layout=layout,
  53. size=(500, 500),
  54. finalize=True)
  55. window.liste_eleves = liste_eleves
  56. return window
  57. def make_add_window(caption, role='create', initial_values=None):
  58. if initial_values:
  59. eleve_id, prenom, nom = initial_values
  60. else:
  61. eleve_id = prenom = nom = ''
  62. layout = [
  63. [sg.InputText(eleve_id, k='eleve_id', visible=False)],
  64. [sg.Text(text='Prénom', size=(10,2)), sg.InputText(default_text=prenom, size=(20,2), k='prenom')],
  65. [sg.Text(text='Nom', size=(10,2)), sg.InputText(default_text=nom, size=(20,2), k='nom')],
  66. [sg.Button('Valider', bind_return_key=True), sg.Button('Annuler', bind_return_key=True)]
  67. ]
  68. window = sg.Window(caption,
  69. layout=layout,
  70. finalize=True)
  71. window.role = role
  72. return window
  73. window1, window2 = make_main_window(), None
  74. while True:
  75. window, event, values = sg.read_all_windows()
  76. # print(f'window : {window}, event : {event}, values : {values}')
  77. if window == window1:
  78. if event in (sg.WIN_CLOSED, 'Quitter'):
  79. break
  80. if event == 'Ajouter':
  81. window2 = make_add_window('Ajouter', role='create')
  82. window2.make_modal()
  83. if event == 'Supprimer':
  84. try:
  85. # dans le cas d'un tableau, la valeur est un tableau de(s)
  86. # index sélectionnés. On garde le premier quoi qu'il arrive
  87. selected_line = values['table_eleves'][0]
  88. # la colonne id est cachée au niveau de l'affichage
  89. id_eleve = window1.liste_eleves[selected_line][0]
  90. except IndexError:
  91. sg.popup_ok('Veuillez sélectionner un enregistrement à supprimer')
  92. continue
  93. confirmation = sg.popup("Confirmez-vous la suppression ?",
  94. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  95. custom_text=("Oui", "Non"))
  96. if confirmation=="Non":
  97. continue
  98. cursor.execute(DELETE_BY_ID, (id_eleve,))
  99. db.commit()
  100. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  101. window1['table_eleves'].update(values=liste_eleves,
  102. num_rows=len(liste_eleves))
  103. # On ne peut pas retrouver la liste des élèves à partir du tableau;
  104. # alors on l'attache à la window1
  105. window1.liste_eleves = liste_eleves
  106. if event == 'Modifier':
  107. try:
  108. # voir 'Supprimer' pour une explication
  109. selected_line = values['table_eleves'][0]
  110. id_eleve, nom, prenom = window1.liste_eleves[selected_line]
  111. except IndexError:
  112. sg.popup_ok('Veuillez sélectionner un enregistrement à modifier')
  113. continue
  114. window2 = make_add_window('Modifier',
  115. initial_values=[id_eleve, prenom, nom],
  116. role='modify')
  117. window2.make_modal()
  118. if window == window2:
  119. if event in (sg.WIN_CLOSED, 'Annuler'):
  120. window2.close()
  121. window2 = None
  122. if event == 'Valider' and window.role == 'create' :
  123. prenom = values['prenom'].capitalize()
  124. nom = values['nom'].upper()
  125. try:
  126. cursor.execute(INSERT_STUDENT, (prenom, nom))
  127. db.commit()
  128. except sqlite3.IntegrityError:
  129. sg.popup_error('Cet élève existe déjà dans la base de données')
  130. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  131. window1['table_eleves'].update(values=liste_eleves,
  132. num_rows=len(liste_eleves))
  133. window1.liste_eleves = liste_eleves
  134. window2.close()
  135. window2 = None
  136. if event == 'Valider' and window.role == 'modify':
  137. confirmation = sg.popup("Confirmez-vous la modification ?",
  138. button_type=sg.POPUP_BUTTONS_OK_CANCEL,
  139. custom_text=("Oui", "Non"))
  140. if confirmation=="Non":
  141. continue
  142. prenom = values['prenom'].capitalize()
  143. nom = values['nom'].upper()
  144. eleve_id = values['eleve_id']
  145. try:
  146. cursor.execute(UPDATE_STUDENT_BY_ID, (prenom, nom, eleve_id))
  147. db.commit()
  148. except sqlite3.IntegrityError:
  149. sg.popup_error('Cet élève existe déjà dans la base de données')
  150. liste_eleves = cursor.execute(SELECT_ALL).fetchall()
  151. window1['table_eleves'].update(values=liste_eleves,
  152. num_rows=len(liste_eleves))
  153. window1.liste_eleves = liste_eleves
  154. window2.close()
  155. window2 = None
  156. window1.close()
  157. if window2 is not None:
  158. window2.close()
  159. db.close()
  160. print('Bye !')