Advertisement
Guest User

Untitled

a guest
Nov 30th, 2017
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 68.49 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. #!/usr/bin/python
  4. #-*- coding: utf-8 -*-
  5.  
  6. from PyQt4.QtGui import *
  7. from PyQt4.QtCore import *
  8. import sys, os
  9. from PIL import Image
  10.  
  11. class EssaiQStackedWidget_Seq_Prof(QWidget) :
  12. # Classe essai QTable Widget
  13. def __init__(self, parent=None):
  14. super(EssaiQStackedWidget_Seq_Prof, self).__init__(parent)
  15.  
  16. self.setWindowTitle("Essai QStackedWidget Seq Prof")
  17. self.resize(400, 540)
  18. self.setGeometry(0, 0, 400, 540)
  19.  
  20. groupe_1 = QGroupBox()
  21.  
  22. # La liste du menu se fait par
  23. # l'intermédiaire d'un QComBoBox
  24. liste = [u"Phase 1 de construction de la séquence du professeur (Niveau de classe, ..., Titre progression, Incitation, Demande, ...)", u"Phase 2 de construction de la séquence du professeur (Questionnement, Que vont apprendre les élèves, ...)", u"Phase 3 de construction de la séquence du professeur (Mots de vocabulaire et leurs définitions)", u"Phase 4 de construction de la séquence du professeur (Questions posées aux élèves)", u"Phase 5 de construction de la séquence du professeur (Références artistiques)", u"Phase 6 de construction de la séquence du professeur (Compétences travaillées, évaluation)"]
  25. self.liste_menu = QComboBox()
  26. self.liste_menu.setMinimumHeight(36)
  27. self.liste_menu.addItems(liste)
  28. # ToolTips sur les items de la combo
  29. self.liste_menu.setItemData(0, u"Niveau de classe, durée, Séquence n°, Titre progression, Incitation,\nDemande, Notions abordées, Consignes, Contraintes", Qt.ToolTipRole)
  30. self.liste_menu.setItemData(1, u"Questionnement, Que vont apprendre les élèves,\nQuestion d'enseignement, Entrée principale du\nprogramme, Champ des pratiques plastiques", Qt.ToolTipRole)
  31. self.liste_menu.setItemData(2, u"Vocabulaire", Qt.ToolTipRole)
  32. self.liste_menu.setItemData(3, u"Questions posées aux élèves", Qt.ToolTipRole)
  33. self.liste_menu.setItemData(4, u"Références artistiques", Qt.ToolTipRole)
  34. self.liste_menu.setItemData(5, u"Compétences travaillées, évaluation", Qt.ToolTipRole)
  35.  
  36. self.w_menu_stack_1 = QWidget()
  37. self.w_menu_stack_2 = QWidget()
  38. self.w_menu_stack_3 = QWidget()
  39. self.w_menu_stack_4 = QWidget()
  40. self.w_menu_stack_5 = QWidget()
  41. self.w_menu_stack_6 = QWidget()
  42.  
  43. self.stack_phase_1()
  44. self.stack_phase_2()
  45. self.stack_phase_3()
  46. self.stack_phase_4()
  47. self.stack_phase_5()
  48. self.stack_phase_6()
  49.  
  50. self.stack = QStackedWidget(self)
  51. self.stack.addWidget(self.w_menu_stack_1)
  52. self.stack.addWidget(self.w_menu_stack_2)
  53. self.stack.addWidget(self.w_menu_stack_3)
  54. self.stack.addWidget(self.w_menu_stack_4)
  55. self.stack.addWidget(self.w_menu_stack_5)
  56. self.stack.addWidget(self.w_menu_stack_6)
  57.  
  58. hbox = QVBoxLayout(self)
  59. hbox.addWidget(self.liste_menu)
  60. hbox.addWidget(self.stack)
  61.  
  62. self.setLayout(hbox)
  63.  
  64. # Phase 3
  65. # -----------------------
  66. # Dictionnaire des mots de vocabulaire
  67. # -----------------------
  68. self.dico_vocab_mot = {}
  69. # -----------------------
  70. # Dictionnaire des définitions des mots de vocabulaire
  71. # -----------------------
  72. self.dico_vocab_def = {}
  73. # -----------------------
  74. # Liste pour chargement des données
  75. # (écriture des textes par l'utilisateur)
  76. # -----------------------
  77. self.liste_mots_vocabulaire = []
  78.  
  79. # Phase 4
  80. # -----------------------
  81. # Dictionnaire des questions
  82. # posées aux élèves
  83. # -----------------------
  84. self.dico_question_pos_elev = {}
  85. # -----------------------
  86. # Liste pour chargement des données
  87. # (écriture des textes par l'utilisateur)
  88. # -----------------------
  89. self.liste_questions_pos_elev = []
  90.  
  91. # Phase 5
  92. # -----------------------
  93. # Dictionnaire du chemin des références artistiques
  94. # -----------------------
  95. self.dico_chem_ref_art = {}
  96. # -----------------------
  97. # Dictionnaire des commentaires des références artistiques
  98. # -----------------------
  99. self.dico_com_ref_art = {}
  100. # -----------------------
  101. # Dictionnaire des QPushButton de chargement références artistiques
  102. # -----------------------
  103. self.dico_bout_charg_ref_art = {}
  104. # -----------------------
  105. # Liste pour chargement des données
  106. # -----------------------
  107. self.liste_ref_artistiques = []
  108. # -----------------------
  109. # Dictionnaire des dimensions (largeur, hauteur) des images
  110. # références artistiques (transformées en vignettes)
  111. # -----------------------
  112. self.dico_ref_art_w_h_vignettes = {}
  113.  
  114. # Phase 6
  115. # -----------------------
  116. # Dictionnaire du combo des compétences travaillées
  117. # -----------------------
  118. self.dico_combo_compet_travail = {}
  119. # -----------------------
  120. # Dictionnaire pour la traduction des compétences travaillées
  121. # Il s'agit des compétences travaillées traduites pour l'élève
  122. # -----------------------
  123. self.dico_traduc_compet_travail = {}
  124. # -----------------------
  125. # Dictionnaire des domaines du socle commun associés
  126. # aux compétences travaillées
  127. # -----------------------
  128. self.dico_domaines_du_socle = {}
  129. # -----------------------
  130. # Dictionnaire des domaines du socle commun associés
  131. # aux compétences travaillées
  132. # -----------------------
  133. self.dico_spinbox_pts_chiffres = {}
  134. # -----------------------
  135. # Liste pour chargement des données
  136. # -----------------------
  137. self.liste_compet_travail_socle_eval = []
  138.  
  139. # ================================================
  140. # Initialisation de la listes de récup des données
  141. self.liste_donnees = []
  142. # ================================================
  143.  
  144. # Signal
  145. self.liste_menu.currentIndexChanged.connect(self.affiche_phases)
  146.  
  147. def stack_phase_1(self):
  148. '''
  149. '''
  150. # Widgets groupés
  151. groupe_1 = QGroupBox()
  152. groupe_2 = QGroupBox()
  153.  
  154. grid_1 = QGridLayout()
  155. grid_1.setSpacing(0)
  156.  
  157. grid_2 = QGridLayout()
  158. grid_2.setSpacing(0)
  159.  
  160. # ==========================================
  161. # Labels Stacked 1
  162. # ==========================================
  163. label_classe = QLabel(u"Niveau de classe :")
  164. label_duree = QLabel(u"Durée :")
  165. label_sequence = QLabel(u"Séquence n° :")
  166. label_progression = QLabel(u"Titre progression :")
  167. label_incitation = QLabel(u"Incitation :")
  168. label_demande = QLabel(u"Demande :")
  169. label_notions_abordees = QLabel(u"Notions abordées :")
  170. label_consignes = QLabel(u"Consignes :")
  171. label_contraintes = QLabel(u"Contraintes :")
  172. # ==========================================
  173. # Widgets Stacked 1
  174. # ==========================================
  175. # Cases à cocher pour la sélection du niveau de classe
  176. self.caseClasse6 = QRadioButton(u"6ème")
  177. self.caseClasse5 = QRadioButton(u"5ème")
  178. self.caseClasse4 = QRadioButton(u"4ème")
  179. self.caseClasse3 = QRadioButton(u"3ème")
  180. # Drapeau (aucune classe n'est cochée
  181. # donc self.classe est à 0)
  182. self.classe = 0
  183. # Les lignes de saisie
  184. self.ligne_duree = QLineEdit()
  185. self.ligne_sequence = QLineEdit()
  186. self.ligne_progression = QLineEdit()
  187. self.ligne_incitation = QLineEdit()
  188. # Les QTextEdit de saisie
  189. self.texte_demande = QTextEdit()
  190. self.texte_demande.setMaximumHeight(100)
  191. self.texte_demande.setMinimumHeight(100)
  192. self.texte_notions_abordees = QTextEdit()
  193. self.texte_notions_abordees.setMaximumHeight(42)
  194. self.texte_notions_abordees.setMinimumHeight(42)
  195. self.texte_consignes = QTextEdit()
  196. self.texte_consignes.setMaximumHeight(70)
  197. self.texte_consignes.setMinimumHeight(70)
  198. self.texte_contraintes = QTextEdit()
  199. self.texte_contraintes.setMaximumHeight(70)
  200. self.texte_contraintes.setMinimumHeight(70)
  201.  
  202. # Disposition dans la grille (stacked 1)
  203. grid_1.addWidget(label_classe, 0, 0)
  204. grid_1.addWidget(self.caseClasse6, 0, 1)
  205. grid_1.addWidget(self.caseClasse5, 0, 2)
  206. grid_1.addWidget(self.caseClasse4, 0, 3)
  207. grid_1.addWidget(self.caseClasse3, 0, 4)
  208.  
  209. grid_2.addWidget(label_duree, 1, 0)
  210. grid_2.addWidget(self.ligne_duree, 1, 1, 1, 4)
  211. grid_2.addWidget(label_sequence, 2, 0)
  212. grid_2.addWidget(self.ligne_sequence, 2, 1, 1, 4)
  213. grid_2.addWidget(label_progression, 3, 0)
  214. grid_2.addWidget(self.ligne_progression, 3, 1, 1, 4)
  215. grid_2.addWidget(label_incitation, 4, 0)
  216. grid_2.addWidget(self.ligne_incitation, 4, 1, 1, 4)
  217. grid_2.addWidget(label_demande, 5, 0)
  218. grid_2.addWidget(self.texte_demande, 5, 1, 1, 4)
  219. grid_2.addWidget(label_notions_abordees, 6, 0)
  220. grid_2.addWidget(self.texte_notions_abordees, 6, 1, 1, 4)
  221. grid_2.addWidget(label_consignes, 7, 0)
  222. grid_2.addWidget(self.texte_consignes, 7, 1, 1, 4)
  223. grid_2.addWidget(label_contraintes, 8, 0)
  224. grid_2.addWidget(self.texte_contraintes, 8, 1, 1, 4)
  225.  
  226. # ============================================= #
  227. groupe_1.setLayout(grid_1)
  228. groupe_2.setLayout(grid_2)
  229.  
  230. layout = QGridLayout()
  231. layout.setSpacing(4)
  232. layout.addWidget(groupe_1, 0, 0)
  233. layout.addWidget(groupe_2, 1, 0)
  234. # ============================================= #
  235.  
  236. # Le QStackedWidget englobe et fait apparaître la grille
  237. # ici la grille layout (qui elle-même englobe le QGroupBox)
  238. self.w_menu_stack_1.setLayout(layout)
  239.  
  240. # ==========================================
  241. # Signaux
  242. # ==========================================
  243. # Les cases à cocher QRadioButton (utilisation de lambda
  244. # car il y a un argument dans la fonction appelée)
  245. self.caseClasse6.toggled.connect(lambda:self.caseEtCombo(self.caseClasse6))
  246. self.caseClasse5.toggled.connect(lambda:self.caseEtCombo(self.caseClasse5))
  247. self.caseClasse4.toggled.connect(lambda:self.caseEtCombo(self.caseClasse4))
  248. self.caseClasse3.toggled.connect(lambda:self.caseEtCombo(self.caseClasse3))
  249. #
  250. self.ligne_duree.textChanged.connect(self.changements_phase_1)
  251. self.ligne_sequence.textChanged.connect(self.changements_phase_1)
  252. self.ligne_progression.textChanged.connect(self.changements_phase_1)
  253. self.ligne_incitation.textChanged.connect(self.changements_phase_1)
  254. #
  255. self.texte_demande.textChanged.connect(self.changements_phase_1)
  256. self.texte_notions_abordees.textChanged.connect(self.changements_phase_1)
  257. self.texte_consignes.textChanged.connect(self.changements_phase_1)
  258. self.texte_contraintes.textChanged.connect(self.changements_phase_1)
  259.  
  260. def stack_phase_2(self):
  261. '''
  262. '''
  263. # Widgets groupés
  264. groupe_1 = QGroupBox()
  265. groupe_2 = QGroupBox()
  266. groupe_3 = QGroupBox()
  267.  
  268. grid_1 = QGridLayout()
  269. grid_1.setSpacing(0)
  270.  
  271. grid_2 = QGridLayout()
  272. grid_2.setSpacing(10)
  273.  
  274. grid_3 = QGridLayout()
  275. grid_3.setSpacing(10)
  276.  
  277. # ==========================================
  278. # Labels Stacked 2
  279. # ==========================================
  280. label_questionnement = QLabel(u"Questionnement :")
  281. label_que_vont_app_eleves = QLabel(u"Que vont apprendre\nles élèves :")
  282. label_question_denseignement = QLabel(u"Question\nd'enseignement :")
  283. label_entree_princ_prog = QLabel(u"Entrée principale\ndu programme :")
  284. label_champ_pratiq_plast = QLabel(u"Champ des pratiques\nplastiques :")
  285. # ==========================================
  286. # Widgets Stacked 2
  287. # ==========================================
  288. self.texte_questionnement = QTextEdit()
  289. self.texte_questionnement.setMaximumHeight(90)
  290. self.texte_questionnement.setMinimumHeight(90)
  291. self.texte_que_vont_app_eleves = QTextEdit()
  292. self.texte_que_vont_app_eleves.setMaximumHeight(90)
  293. self.texte_que_vont_app_eleves.setMinimumHeight(90)
  294. self.texte_question_denseignement = QTextEdit()
  295. self.texte_question_denseignement.setMaximumHeight(90)
  296. self.texte_question_denseignement.setMinimumHeight(90)
  297. # Cases à cocher pour la sélection de
  298. # l'entrée principale du programme
  299. self.caseEntr_1_Prog = QRadioButton(u"Cours d'Arts\nPlastiques")
  300. self.caseEntr_1_Prog.setChecked(True)
  301. # ------------------
  302. # Les cases à cocher sont cachées par défaut
  303. # ------------------
  304. self.caseEntr_1_Prog.hide()
  305. # Drapeau la valeur par défaut est Cours ArtsP quand
  306. # l'utilisateur n'a pas sélectionné de qradiobutton
  307. self.entree_principale_prog = u"Cours d'Arts Plastiques"
  308. print u"Entrée principale du programme :", self.entree_principale_prog
  309. # Cases à cocher pour l'entrée principale du programme
  310. self.caseEntr_2_Prog = QRadioButton(u"Hda")
  311. self.caseEntr_2_Prog.hide()
  312. self.caseEntr_3_Prog = QRadioButton(u"EPI")
  313. self.caseEntr_3_Prog.hide()
  314. self.caseEntr_4_Prog = QRadioButton(u"PEAC")
  315. self.caseEntr_4_Prog.hide()
  316. # Cases à cocher pour la sélection du champ des pratiques plastiques
  317. # ------------------
  318. # Les cases à cocher sont cachées par défaut
  319. # ------------------
  320. self.case_prat_plast_1 = QCheckBox(u"Pratiques\nbidimensionnelles")
  321. self.case_prat_plast_1.hide()
  322. self.case_prat_plast_2 = QCheckBox(u"Pratiques\ntridimensionnelles")
  323. self.case_prat_plast_2.hide()
  324. self.case_prat_plast_3 = QCheckBox(u"Pratiques artistiques\nde l'image fixe et\nanimée")
  325. self.case_prat_plast_3.hide()
  326. self.case_prat_plast_4 = QCheckBox(u"Pratiques de la création\nartistique numérique")
  327. self.case_prat_plast_4.hide()
  328.  
  329. # Disposition dans la grille (stacked 2)
  330. grid_1.addWidget(label_questionnement, 0, 0)
  331. grid_1.addWidget(self.texte_questionnement, 0, 1, 1, 4)
  332. grid_1.addWidget(label_que_vont_app_eleves, 1, 0)
  333. grid_1.addWidget(self.texte_que_vont_app_eleves, 1, 1, 1, 4)
  334. grid_1.addWidget(label_question_denseignement, 2, 0)
  335. grid_1.addWidget(self.texte_question_denseignement, 2, 1, 1, 4)
  336.  
  337. grid_2.addWidget(label_entree_princ_prog, 3, 0)
  338. grid_2.addWidget(self.caseEntr_1_Prog, 3, 1)
  339. grid_2.addWidget(self.caseEntr_2_Prog, 3, 2)
  340. grid_2.addWidget(self.caseEntr_3_Prog, 3, 3)
  341. grid_2.addWidget(self.caseEntr_4_Prog, 3, 4)
  342.  
  343. grid_3.addWidget(label_champ_pratiq_plast, 4, 0)
  344. grid_3.addWidget(self.case_prat_plast_1, 4, 1)
  345. grid_3.addWidget(self.case_prat_plast_2, 4, 2)
  346. grid_3.addWidget(self.case_prat_plast_3, 4, 3)
  347. grid_3.addWidget(self.case_prat_plast_4, 4, 4)
  348. # ============================================= #
  349. groupe_1.setLayout(grid_1)
  350. groupe_2.setLayout(grid_2)
  351. groupe_3.setLayout(grid_3)
  352.  
  353. layout = QGridLayout()
  354. layout.setSpacing(4)
  355. layout.addWidget(groupe_1, 0, 0)
  356. layout.addWidget(groupe_2, 1, 0)
  357. layout.addWidget(groupe_3, 2, 0)
  358. # ============================================= #
  359.  
  360. # Le QStackedWidget englobe et fait apparaître la grille
  361. # ici la grille layout (qui elle-même englobe le QGroupBox)
  362. self.w_menu_stack_2.setLayout(layout)
  363.  
  364. #
  365. self.liste_champ_prat_plast = [0, 0, 0, 0]
  366.  
  367. # ==========================================
  368. # Signaux
  369. # ==========================================
  370. # Les cases à cocher QRadioButton (utilisation de lambda
  371. # car il y a un argument dans la fonction appelée)
  372. self.caseEntr_1_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_1_Prog))
  373. self.caseEntr_2_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_2_Prog))
  374. self.caseEntr_3_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_3_Prog))
  375. self.caseEntr_4_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_4_Prog))
  376. #
  377. self.texte_questionnement.textChanged.connect(self.changements_phase_2)
  378. self.texte_que_vont_app_eleves.textChanged.connect(self.changements_phase_2)
  379. self.texte_question_denseignement.textChanged.connect(self.changements_phase_2)
  380. #
  381. # Les cases à cocher QCheckBox (utilisation de lambda
  382. # car il y a un argument dans la fonction appelée)
  383. # 1 Fonction pour chaque QCheckBox
  384. self.case_prat_plast_1.toggled.connect(lambda:self.casePratPlast_1(self.case_prat_plast_1))
  385. self.case_prat_plast_2.toggled.connect(lambda:self.casePratPlast_2(self.case_prat_plast_2))
  386. self.case_prat_plast_3.toggled.connect(lambda:self.casePratPlast_3(self.case_prat_plast_3))
  387. self.case_prat_plast_4.toggled.connect(lambda:self.casePratPlast_4(self.case_prat_plast_4))
  388.  
  389. def stack_phase_3(self) :
  390. '''
  391. '''
  392. # Widgets groupés
  393. groupe_1 = QGroupBox()
  394. groupe_2 = QGroupBox()
  395. groupe_3 = QGroupBox()
  396.  
  397. self.grille_1_stack_3 = QGridLayout()
  398. self.grille_1_stack_3.setSpacing(0)
  399. self.grille_2_stack_3 = QGridLayout()
  400. self.grille_2_stack_3.setSpacing(60)
  401.  
  402. #############################################
  403. # Insertion d'un QScrollArea (ascenceur)
  404. # ==========================================
  405. # Merci à eylianesc sur stackoverflow pour l'aide apportée pour coder l'ascenceur, voir ici :
  406. # https://stackoverflow.com/questions/47491386/pyqt4-add-a-qsrollarea-on-a-group-of-widgets/47492009#47492009
  407. # ==========================================
  408. scrollArea = QScrollArea(self)
  409. scrollArea.setWidgetResizable(True)
  410.  
  411. wid = QWidget(self)
  412. scrollArea.setWidget(wid)
  413. self.grille_3_stack_3 = QGridLayout(wid)
  414. self.grille_3_stack_3.setSpacing(0)
  415. #############################################
  416.  
  417. # ==========================================
  418. # Labels Stacked 3
  419. # ==========================================
  420. self.label_annonce_vocab = QLabel(u"Pour ajouter (et éditer) des mots de vocabulaire, cliquez sur le bouton <b>Ajouter une ligne de vocabulaire</b>")
  421. label_mot_vocabulaire = QLabel(u"Mots de vocabulaire")
  422. label_definitions = QLabel(u"Définitions")
  423. # ==========================================
  424. # Widgets Stacked 3
  425. # ==========================================
  426. # Bouton pour ajouter une ligne pour les mots de vocabulaire
  427. self.bouton_ajout_ligne_vocabulaire = QPushButton(u"Ajouter une ligne de vocabulaire")
  428. # Bouton pour supprimer une ligne pour les mots de vocabulaire
  429. self.bouton_supprime_ligne_vocabulaire = QPushButton(u"Supprimer une ligne de vocabulaire")
  430.  
  431. # Disposition dans la grille (stacked 3)
  432. self.grille_1_stack_3.addWidget(self.bouton_ajout_ligne_vocabulaire, 0, 0)
  433. self.grille_1_stack_3.addWidget(self.bouton_supprime_ligne_vocabulaire, 0, 1)
  434.  
  435. self.grille_2_stack_3.addWidget(label_mot_vocabulaire, 0, 0, 1, 1)
  436. self.grille_2_stack_3.addWidget(label_definitions, 0, 1, 1, 1)
  437.  
  438. #self.grille_3_stack_3.addWidget(self.label_annonce_vocab, 0, 0)
  439. # ============================================= #
  440. groupe_1.setLayout(self.grille_1_stack_3)
  441. groupe_2.setLayout(self.grille_2_stack_3)
  442. #groupe_3.setLayout(self.grille_3_stack_3)
  443.  
  444. #############################################
  445. # 2ème partie de l'ajout du QScrollArea
  446. groupe_3.setLayout(QVBoxLayout())
  447. groupe_3.layout().addWidget(scrollArea)
  448. #############################################
  449.  
  450. layout = QGridLayout()
  451. layout.setSpacing(0)
  452. layout.addWidget(groupe_1, 0, 0)
  453. layout.addWidget(groupe_2, 1, 0)
  454. layout.addWidget(groupe_3, 2, 0)
  455. # ============================================= #
  456.  
  457. # Le QStackedWidget englobe et fait apparaître la grille
  458. # ici la grille layout (qui elle-même englobe le QGroupBox)
  459. self.w_menu_stack_3.setLayout(layout)
  460.  
  461. # ==========================================
  462. # Signaux
  463. # ==========================================
  464. # Les boutons ajoutent des lignes de vocabulaire et peuvent aussi les enlever
  465. self.bouton_ajout_ligne_vocabulaire.clicked.connect(self.ajouter_un_mot_vocab)
  466. self.bouton_supprime_ligne_vocabulaire.clicked.connect(self.supprimer_un_mot_vocab)
  467.  
  468. def stack_phase_4(self) :
  469. '''
  470. '''
  471. # Widgets groupés
  472. groupe_1 = QGroupBox()
  473. groupe_2 = QGroupBox()
  474. groupe_3 = QGroupBox()
  475.  
  476. self.grille_1_stack_4 = QGridLayout()
  477. self.grille_1_stack_4.setSpacing(0)
  478. self.grille_2_stack_4 = QGridLayout()
  479. self.grille_2_stack_4.setSpacing(0)
  480.  
  481. #############################################
  482. # Insertion d'un QScrollArea (ascenceur)
  483. # ==========================================
  484. # Merci à eylianesc sur stackoverflow pour l'aide apportée pour coder l'ascenceur, voir ici :
  485. # https://stackoverflow.com/questions/47491386/pyqt4-add-a-qsrollarea-on-a-group-of-widgets/47492009#47492009
  486. # ==========================================
  487. scrollArea = QScrollArea(self)
  488. scrollArea.setWidgetResizable(True)
  489.  
  490. wid = QWidget(self)
  491. scrollArea.setWidget(wid)
  492. self.grille_3_stack_4 = QGridLayout(wid)
  493. self.grille_3_stack_4.setSpacing(0)
  494. #############################################
  495.  
  496. # ==========================================
  497. # Labels Stacked 4
  498. # ==========================================
  499. label_annonce_questions = QLabel(u"Pour ajouter (et éditer) des questions posées aux élèves, cliquez sur le bouton <b>Ajouter une ligne de question posée aux élèves</b>")
  500. label_questions = QLabel(u"Questions posées aux élèves")
  501. #label_definitions = QLabel(u"Définitions")
  502. # ==========================================
  503. # Widgets Stacked 4
  504. # ==========================================
  505. # Bouton pour ajouter une ligne de question posée aux élèves
  506. self.bouton_ajout_ligne_question = QPushButton(u"Ajouter une ligne de question posée aux élèves")
  507. # Bouton pour supprimer une ligne de question posée aux élèves
  508. self.bouton_supprime_ligne_question = QPushButton(u"Supprimer une ligne de question posée aux élèves")
  509.  
  510. # Disposition dans la grille (stacked 4)
  511. self.grille_1_stack_4.addWidget(self.bouton_ajout_ligne_question, 0, 0)
  512. self.grille_1_stack_4.addWidget(self.bouton_supprime_ligne_question, 0, 1)
  513.  
  514. self.grille_2_stack_4.addWidget(label_questions, 0, 0, 1, 1)
  515.  
  516. #self.grille_3_stack_3.addWidget(label_annonce_questions, 0, 0)
  517. # ============================================= #
  518. groupe_1.setLayout(self.grille_1_stack_4)
  519. groupe_2.setLayout(self.grille_2_stack_4)
  520. #groupe_3.setLayout(self.grille_3_stack_4)
  521.  
  522. #############################################
  523. # 2ème partie de l'ajout du QScrollArea
  524. groupe_3.setLayout(QVBoxLayout())
  525. groupe_3.layout().addWidget(scrollArea)
  526. #############################################
  527.  
  528. layout = QGridLayout()
  529. layout.setSpacing(0)
  530. layout.addWidget(groupe_1, 0, 0)
  531. layout.addWidget(groupe_2, 1, 0)
  532. layout.addWidget(groupe_3, 2, 0)
  533. # ============================================= #
  534.  
  535. # Le QStackedWidget englobe et fait apparaître la grille
  536. # ici la grille layout (qui elle-même englobe le QGroupBox)
  537. self.w_menu_stack_4.setLayout(layout)
  538.  
  539. # ==========================================
  540. # Signaux
  541. # ==========================================
  542. # Les boutons ajoutent des lignes de questions et peuvent aussi les enlever
  543. self.bouton_ajout_ligne_question.clicked.connect(self.ajouter_une_question)
  544. self.bouton_supprime_ligne_question.clicked.connect(self.supprimer_la_question)
  545.  
  546. def stack_phase_5(self) :
  547. '''
  548. '''
  549. # Widgets groupés
  550. groupe_1 = QGroupBox()
  551. groupe_2 = QGroupBox()
  552. groupe_3 = QGroupBox()
  553.  
  554. self.grille_1_stack_5 = QGridLayout()
  555. self.grille_1_stack_5.setSpacing(0)
  556. self.grille_2_stack_5 = QGridLayout()
  557. self.grille_2_stack_5.setSpacing(136)
  558.  
  559. #############################################
  560. # Insertion d'un QScrollArea (ascenceur)
  561. # ==========================================
  562. # Merci à eylianesc sur stackoverflow pour l'aide apportée pour coder l'ascenceur, voir ici :
  563. # https://stackoverflow.com/questions/47491386/pyqt4-add-a-qsrollarea-on-a-group-of-widgets/47492009#47492009
  564. # ==========================================
  565. scrollArea = QScrollArea(self)
  566. scrollArea.setWidgetResizable(True)
  567.  
  568. wid = QWidget(self)
  569. scrollArea.setWidget(wid)
  570. self.grille_3_stack_5 = QGridLayout(wid)
  571. self.grille_3_stack_5.setSpacing(0)
  572. #############################################
  573.  
  574. # ==========================================
  575. # Labels Stacked 5
  576. # ==========================================
  577. self.label_annonce_ref_art = QLabel(u"Pour ajouter (et éditer) des références artistiques, cliquez sur le bouton <b>Ajouter une référence artistique</b>")
  578. label_chem_img_ref_art = QLabel(u"Chemin de l'image")
  579. label_com_ref_art = QLabel(u"Commentaire sur l'oeuvre")
  580. label_com_ref_art.setGeometry(QRect(500, 500, 500, 100))
  581. #label_com_ref_art.resize(1000, 30)
  582. label_charg_img_ref_art = QLabel(u"Bouton pour charger l'image")
  583. # ==========================================
  584. # Widgets Stacked 5
  585. # ==========================================
  586. # Bouton pour ajouter une ligne pour les références artistiques
  587. self.bouton_ajout_ligne_ref_art = QPushButton(u"Ajouter une référence artistique")
  588. # Bouton pour supprimer une ligne pour les références artistiques
  589. self.bouton_supprime_ligne_ref_art = QPushButton(u"Supprimer une référence artistique")
  590.  
  591. # Disposition dans la grille (stacked 5)
  592. self.grille_1_stack_5.addWidget(self.bouton_ajout_ligne_ref_art, 0, 0)
  593. self.grille_1_stack_5.addWidget(self.bouton_supprime_ligne_ref_art, 0, 1)
  594.  
  595. self.grille_2_stack_5.addWidget(label_chem_img_ref_art, 0, 0, 1, 1)
  596. self.grille_2_stack_5.addWidget(label_com_ref_art, 0, 1, 1, 1)
  597. self.grille_2_stack_5.addWidget(label_charg_img_ref_art, 0, 2, 1, 1)
  598.  
  599. #self.grille_3_stack_5.addWidget(self.label_annonce_ref_art, 0, 0)
  600.  
  601. # ============================================= #
  602. groupe_1.setLayout(self.grille_1_stack_5)
  603. groupe_2.setLayout(self.grille_2_stack_5)
  604. #############################################
  605. # 2ème partie de l'ajout du QScrollArea
  606. groupe_3.setLayout(QVBoxLayout())
  607. groupe_3.layout().addWidget(scrollArea)
  608. #############################################
  609.  
  610. layout = QGridLayout()
  611. layout.setSpacing(0)
  612. layout.addWidget(groupe_1, 0, 0)
  613. layout.addWidget(groupe_2, 1, 0)
  614. layout.addWidget(groupe_3, 2, 0)
  615. # ============================================= #
  616.  
  617. # Le QStackedWidget englobe et fait apparaître la grille
  618. # ici la grille layout (qui elle-même englobe le QGroupBox)
  619. self.w_menu_stack_5.setLayout(layout)
  620.  
  621. # ==========================================
  622. # Signaux
  623. # ==========================================
  624. # Les boutons ajoutent des lignes pour les références artistiques et peuvent aussi les enlever
  625. self.bouton_ajout_ligne_ref_art.clicked.connect(self.ajouter_ref_artistique)
  626. self.bouton_supprime_ligne_ref_art.clicked.connect(self.supprimer_ref_artistique)
  627.  
  628. def stack_phase_6(self) :
  629. '''
  630. '''
  631. # Widgets groupés
  632. groupe_1 = QGroupBox()
  633. groupe_2 = QGroupBox()
  634. groupe_3 = QGroupBox()
  635.  
  636. self.grille_1_stack_6 = QGridLayout()
  637. self.grille_1_stack_6.setSpacing(0)
  638. self.grille_2_stack_6 = QGridLayout()
  639. self.grille_2_stack_6.setSpacing(136)
  640.  
  641. #############################################
  642. # Insertion d'un QScrollArea (ascenceur)
  643. # ==========================================
  644. # Merci à eylianesc sur stackoverflow pour l'aide apportée pour coder l'ascenceur, voir ici :
  645. # https://stackoverflow.com/questions/47491386/pyqt4-add-a-qsrollarea-on-a-group-of-widgets/47492009#47492009
  646. # ==========================================
  647. scrollArea = QScrollArea(self)
  648. scrollArea.setWidgetResizable(True)
  649.  
  650. wid = QWidget(self)
  651. scrollArea.setWidget(wid)
  652. self.grille_3_stack_6 = QGridLayout(wid)
  653. self.grille_3_stack_6.setSpacing(0)
  654. #############################################
  655.  
  656. # ==========================================
  657. # Labels Stacked 5
  658. # ==========================================
  659. #self.label_annonce_ref_art = QLabel(u"Pour ajouter (et éditer) des références artistiques, cliquez sur le bouton <b>Ajouter une référence artistique</b>")
  660. label_compet_travail = QLabel(u"Compétences travaillées")
  661. label_traduc_compet_travail = QLabel(u"Traduction de la compétence")
  662. #label_traduc_compet_travail.setGeometry(QRect(300, 300, 300, 100))
  663. label_domaines_socle = QLabel(u"Domaines du socle")
  664. label_criteres_eval_chiffree = QLabel(u"Points chiffrés")
  665. # ==========================================
  666. # Widgets Stacked 5
  667. # ==========================================
  668. # Bouton pour ajouter une ligne pour les références artistiques
  669. self.bouton_ajout_ligne_eval = QPushButton(u"Ajouter une ligne d'évaluation")
  670. # Bouton pour supprimer une ligne pour les références artistiques
  671. self.bouton_supprime_ligne_eval = QPushButton(u"Supprimer une ligne d'évaluation")
  672.  
  673. # Disposition dans la grille (stacked 5)
  674. self.grille_1_stack_6.addWidget(self.bouton_ajout_ligne_eval, 0, 0)
  675. self.grille_1_stack_6.addWidget(self.bouton_supprime_ligne_eval, 0, 1)
  676.  
  677. self.grille_2_stack_6.addWidget(label_compet_travail, 0, 0, 1, 1)
  678. self.grille_2_stack_6.addWidget(label_traduc_compet_travail, 0, 1, 1, 1)
  679. self.grille_2_stack_6.addWidget(label_domaines_socle, 0, 2, 1, 1)
  680. self.grille_2_stack_6.addWidget(label_criteres_eval_chiffree, 0, 3, 1, 1)
  681.  
  682. #self.grille_3_stack_5.addWidget(self.label_annonce_ref_art, 0, 0)
  683.  
  684. # ============================================= #
  685. groupe_1.setLayout(self.grille_1_stack_6)
  686. groupe_2.setLayout(self.grille_2_stack_6)
  687. #############################################
  688. # 2ème partie de l'ajout du QScrollArea
  689. groupe_3.setLayout(QVBoxLayout())
  690. groupe_3.layout().addWidget(scrollArea)
  691. #############################################
  692.  
  693. layout = QGridLayout()
  694. layout.setSpacing(0)
  695. layout.addWidget(groupe_1, 0, 0)
  696. layout.addWidget(groupe_2, 1, 0)
  697. layout.addWidget(groupe_3, 2, 0)
  698. # ============================================= #
  699.  
  700. # Le QStackedWidget englobe et fait apparaître la grille
  701. # ici la grille layout (qui elle-même englobe le QGroupBox)
  702. self.w_menu_stack_6.setLayout(layout)
  703.  
  704. # ==========================================
  705. # Signaux
  706. # ==========================================
  707. # Les boutons ajoutent des lignes pour les et peuvent aussi les enlever
  708. self.bouton_ajout_ligne_eval.clicked.connect(self.ajouter_eval)
  709. self.bouton_supprime_ligne_eval.clicked.connect(self.supprimer_eval)
  710.  
  711. def caseEtCombo(self, c):
  712. ''' Fonction de récupération des valeurs des
  713. cases à cocher pour le niveau de classe '''
  714. # Sélection des classes et on montre ou on cache
  715. # les combos (et items contenus) des compétences
  716. # travaillées
  717. if c.isChecked() == True :
  718. self.classe = unicode(c.text()[0])
  719. else : self.classe = 0
  720. if self.classe == u"6" :
  721. print "Niveau de classe :", self.classe
  722. elif self.classe in [u'5', u'4', u'3']:
  723. # Drapeau (quand l'utilisateur n'a
  724. # pas sélectionné de qradiobutton)
  725. print "Niveau de classe :", self.classe
  726.  
  727. # Les cases à cocher de l'Entrée principale
  728. # du programme et le Champ des pratiques
  729. # plastiques apparaissent quand l'utilisateur
  730. # a renseigné le niveau de classe
  731. if self.classe != 0 :
  732. self.caseEntr_1_Prog.show()
  733. self.caseEntr_2_Prog.show()
  734. self.caseEntr_3_Prog.show()
  735. self.caseEntr_4_Prog.show()
  736. self.case_prat_plast_1.show()
  737. self.case_prat_plast_2.show()
  738. self.case_prat_plast_3.show()
  739. self.case_prat_plast_4.show()
  740. # Le texte introduit va aider à ce qu'il n'y
  741. # ait pas d'erreur au niveau de l'Entrée principale
  742. # du programme et le Champ des pratiques plastiques
  743. self.ligne_duree.setText(u" ")
  744. # Pareil ici pour le QTextEdit Question d'enseignement
  745. self.texte_question_denseignement.insertPlainText(u" ")
  746.  
  747. def changements_phase_1(self) :
  748. '''
  749. '''
  750. # Récup des données
  751. try : self.duree = unicode(self.ligne_duree.text())
  752. except : self.duree = u''
  753. try : self.sequence = unicode(self.ligne_sequence.text())
  754. except : self.sequence = u''
  755. try : self.progression = unicode(self.ligne_progression.text())
  756. except : self.progression = u''
  757. try : self.incitation = unicode(self.ligne_incitation.text())
  758. except : self.incitation = u''
  759. try : self.demande = unicode(self.texte_demande.toPlainText())
  760. except : self.demande = u''
  761. try : self.notions = unicode(self.texte_notions_abordees.toPlainText())
  762. except : self.notions = u''
  763. try : self.consignes = unicode(self.texte_consignes.toPlainText())
  764. except : self.consignes = u''
  765. try : self.contraintes = unicode(self.texte_contraintes.toPlainText())
  766. except : self.contraintes = u''
  767.  
  768. # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
  769. if self.classe == 0 :
  770. message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
  771.  
  772. #
  773. try :
  774. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, self.notions, self.consignes, self.contraintes])
  775. #
  776. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  777. except : pass
  778.  
  779. #
  780. print "self.liste_donnees_finales", self.liste_donnees_finales
  781.  
  782. def entreePrincipaleProg(self, c):
  783. ''' Fonction de récupération des valeurs des
  784. cases à cocher pour l'entrée principale du programme '''
  785.  
  786. if c.isChecked() == True :
  787. self.entree_principale_prog = unicode(c.text())
  788. if self.entree_principale_prog == u"Cours d'Arts\nPlastiques" :
  789. print u"Entrée principale du programme :", self.entree_principale_prog
  790. elif self.entree_principale_prog in [u"Hda", u"EPI", u"PEAC"]:
  791. # Drapeau (quand l'utilisateur n'a
  792. # pas sélectionné de qradiobutton)
  793. print u"Entrée principale du programme :", self.entree_principale_prog
  794.  
  795. #
  796. try :
  797. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  798. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  799. self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
  800. #
  801. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  802. except :
  803. pass
  804.  
  805. #
  806. print "self.liste_donnees_finales", self.liste_donnees_finales
  807.  
  808. def changements_phase_2(self) :
  809. '''
  810. '''
  811. # Récup des données
  812. try : self.questionnement = unicode(self.texte_questionnement.toPlainText())
  813. except : self.questionnement = u''
  814. try : self.que_vont_app_eleves = unicode(self.texte_que_vont_app_eleves.toPlainText())
  815. except : self.que_vont_app_eleves = u''
  816. try : self.question_denseignement = unicode(self.texte_question_denseignement.toPlainText())
  817. except : self.question_denseignement = u''
  818.  
  819. # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
  820. if self.classe == 0 :
  821. message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
  822.  
  823. #
  824. try :
  825. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  826. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  827. self.que_vont_app_eleves, self.question_denseignement])
  828. #
  829. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  830. except : pass
  831.  
  832. #
  833. print "self.liste_donnees_finales", self.liste_donnees_finales
  834.  
  835. # ==============================================================================
  836. ''' Fonctions de récupération des valeurs. Cases
  837. à cocher pour le champ des pratiques plastiques '''
  838.  
  839. def casePratPlast_1(self, c):
  840. if c.isChecked() == True :
  841. self.prat_plast = unicode(c.text())
  842. if self.prat_plast == u"Pratiques\nbidimensionnelles" :
  843. self.prat_plast = u"[x] Pratiques bidimensionnelles"
  844. #
  845. self.liste_champ_prat_plast[0] = self.prat_plast
  846.  
  847. if c.isChecked() == False :
  848. # Si la case est décochée on retire
  849. # Pratiques bidimensionnelles de la liste
  850. # 0 est réinséré
  851. self.liste_champ_prat_plast[0] = 0
  852.  
  853. #
  854. try :
  855. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  856. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  857. self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
  858. #
  859. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  860. except : pass
  861.  
  862. #
  863. print "self.liste_donnees_finales", self.liste_donnees_finales
  864.  
  865. def casePratPlast_2(self, c):
  866. if c.isChecked() == True :
  867. self.prat_plast = unicode(c.text())
  868. if self.prat_plast == u"Pratiques\ntridimensionnelles" :
  869. self.prat_plast = u"[x] Pratiques tridimensionnelles"
  870. self.liste_champ_prat_plast[1] = self.prat_plast
  871.  
  872. if c.isChecked() == False :
  873. # Si la case est décochée on retire
  874. # Pratiques tridimensionnelles de la liste
  875. # 0 est réinséré
  876. self.liste_champ_prat_plast[1] = 0
  877. #
  878. try :
  879. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  880. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  881. self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
  882. #
  883. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  884. except : pass
  885.  
  886. #
  887. print "self.liste_donnees_finales", self.liste_donnees_finales
  888.  
  889. def casePratPlast_3(self, c):
  890. if c.isChecked() == True :
  891. self.prat_plast = unicode(c.text())
  892. if self.prat_plast == u"Pratiques artistiques\nde l'image fixe et\nanimée" :
  893. self.prat_plast = u"[x] Pratiques artistiques de l'image fixe et animée"
  894. self.liste_champ_prat_plast[2] = self.prat_plast
  895.  
  896. if c.isChecked() == False :
  897. # Si la case est décochée on retire
  898. # Pratiques artistiques de l'image fixe
  899. # et animée de la liste 0 est réinséré
  900. self.liste_champ_prat_plast[2] = 0
  901. #
  902. try :
  903. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  904. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  905. self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
  906. #
  907. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  908. except : pass
  909.  
  910. #
  911. print "self.liste_donnees_finales", self.liste_donnees_finales
  912.  
  913. def casePratPlast_4(self, c):
  914. if c.isChecked() == True :
  915. self.prat_plast = unicode(c.text())
  916. if self.prat_plast == u"Pratiques de la création\nartistique numérique" :
  917. self.prat_plast = u"[x] Pratiques de la création artistique numérique"
  918. self.liste_champ_prat_plast[3] = self.prat_plast
  919.  
  920. if c.isChecked() == False :
  921. # Si la case est décochée on retire
  922. # Pratiques artistiques de la création
  923. # artistique numérique de la liste 0 est réinséré
  924. self.liste_champ_prat_plast[3] = 0
  925. #
  926. try :
  927. self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
  928. self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
  929. self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
  930. #
  931. self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
  932. except : pass
  933.  
  934. #
  935. print "self.liste_donnees_finales", self.liste_donnees_finales
  936. # ==============================================================================
  937.  
  938. def ajouter_un_mot_vocab(self) :
  939. """
  940. Merci à ekhumoro de m'avoir aidé ici pour la création des
  941. lignes de widgets ; voir la discussion ici sur stackoverflow :
  942. https://stackoverflow.com/questions/47380658/how-to-add-rows-of-widgets-after-deletion-in-a-qgridlayout
  943. """
  944. #
  945. r = len(self.liste_mots_vocabulaire)
  946. #if r >= 0 : self.label_annonce_vocab.hide()
  947. # Création des QTextEdit
  948. self.dico_vocab_mot[r] = QTextEdit()
  949. self.dico_vocab_def[r] = QTextEdit()
  950. self.dico_vocab_mot[r].setMaximumWidth(180)
  951. self.dico_vocab_mot[r].setMinimumWidth(180)
  952. self.dico_vocab_mot[r].setMaximumHeight(64)
  953. self.dico_vocab_mot[r].setMinimumHeight(64)
  954. self.dico_vocab_def[r].setMaximumHeight(64)
  955. self.dico_vocab_def[r].setMinimumHeight(64)
  956. # Répartition dans la grille
  957. self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r], r, 0)
  958. self.grille_3_stack_3.addWidget(self.dico_vocab_def[r], r, 1)
  959. # Ecriture des n°s de lignes dans la partie mots de vocabulaire
  960. self.dico_vocab_mot[r].setText(str(r+1)+'. ')
  961. # Les données sont introduites dans une liste
  962. self.liste_mots_vocabulaire.append([self.dico_vocab_mot[r], self.dico_vocab_def[r]])
  963. # =====================================================
  964. # Signaux
  965. self.dico_vocab_mot[r].textChanged.connect(self.changements_phase_3)
  966. self.dico_vocab_def[r].textChanged.connect(self.changements_phase_3)
  967. # =====================================================
  968.  
  969. def supprimer_un_mot_vocab(self) :
  970. """
  971. Merci à ekhumoro de m'avoir aidé ici pour la suppression des
  972. lignes de widgets ; voir la discussion ici sur stackoverflow :
  973. https://stackoverflow.com/questions/47380658/how-to-add-rows-of-widgets-after-deletion-in-a-qgridlayout
  974. """
  975. # On repère l'indice
  976. row = len(self.liste_mots_vocabulaire) - 1
  977. # Si l'indice de la ligne st supérieur ou egal à 0
  978. if row >= 0:
  979. for column in range(self.grille_3_stack_3.columnCount()):
  980. # On repère à quelle position se trouve l'item
  981. item = self.grille_3_stack_3.itemAtPosition(row, column)
  982. if item is not None:
  983. # On supprime l'item (le widget
  984. # correspondant est supprimé)
  985. item.widget().deleteLater()
  986. # On vide (à chaque passage) l'indice
  987. # correspondant dans la liste
  988. del self.liste_mots_vocabulaire[row]
  989. # On vide aussi à l'indice
  990. # correspondant chaque dictionnaire
  991. del self.dico_vocab_mot[row]
  992. del self.dico_vocab_def[row]
  993.  
  994. def ajouter_une_question(self) :
  995. '''
  996. '''
  997. #
  998. r = len(self.liste_questions_pos_elev)
  999. #if r >= 0 : self.label_annonce_question.hide()
  1000. self.dico_question_pos_elev[r] = QTextEdit()
  1001. self.dico_question_pos_elev[r].setMaximumHeight(64)
  1002. self.dico_question_pos_elev[r].setMinimumHeight(64)
  1003. self.grille_3_stack_4.addWidget(self.dico_question_pos_elev[r], r, 0)
  1004. self.dico_question_pos_elev[r].setText(str(r+1)+'. ')
  1005. self.liste_questions_pos_elev.append(self.dico_question_pos_elev[r])
  1006. # =====================================================
  1007. # Signal
  1008. self.dico_question_pos_elev[r].textChanged.connect(self.changements_phase_4)
  1009. # =====================================================
  1010.  
  1011. def supprimer_la_question(self) :
  1012. '''
  1013. '''
  1014. row = len(self.liste_questions_pos_elev) - 1
  1015. if row >= 0:
  1016. for column in range(self.grille_3_stack_4.columnCount()):
  1017. item = self.grille_3_stack_4.itemAtPosition(row, column)
  1018. if item is not None:
  1019. item.widget().deleteLater()
  1020. del self.liste_questions_pos_elev[row]
  1021. del self.dico_question_pos_elev[row]
  1022.  
  1023. def ajouter_ref_artistique(self) :
  1024. '''
  1025. '''
  1026. #
  1027. r = len(self.liste_ref_artistiques)
  1028. #if r >= 0 : self.label_annonce_vocab.hide()
  1029. # Création des QTextEdit
  1030. self.dico_chem_ref_art[r] = QTextEdit()
  1031. self.dico_com_ref_art[r] = QTextEdit()
  1032. self.dico_chem_ref_art[r].setMaximumWidth(150)
  1033. self.dico_chem_ref_art[r].setMinimumWidth(150)
  1034. self.dico_chem_ref_art[r].setMaximumHeight(84)
  1035. self.dico_chem_ref_art[r].setMinimumHeight(84)
  1036. self.dico_com_ref_art[r].setMaximumWidth(500)
  1037. self.dico_com_ref_art[r].setMinimumWidth(500)
  1038. self.dico_com_ref_art[r].setMaximumHeight(84)
  1039. self.dico_com_ref_art[r].setMinimumHeight(84)
  1040. # Création des boutons de chargement
  1041. self.dico_bout_charg_ref_art[r] = QPushButton(u"Ouvrir référence art. {}".format(r+1))
  1042. # Répartition dans la grille
  1043. self.grille_3_stack_5.addWidget(self.dico_chem_ref_art[r], r, 0)
  1044. self.grille_3_stack_5.addWidget(self.dico_com_ref_art[r], r, 1)
  1045. self.grille_3_stack_5.addWidget(self.dico_bout_charg_ref_art[r], r, 2)
  1046. # Ecriture des n°s de lignes
  1047. self.dico_chem_ref_art[r].setText(str(r+1)+'. ')
  1048. # Les données sont introduites dans une liste
  1049. self.liste_ref_artistiques.append([self.dico_chem_ref_art[r], self.dico_com_ref_art[r], self.dico_bout_charg_ref_art[r]])
  1050. # =====================================================
  1051. # Signaux
  1052. # ---------- Récup des données textuelles
  1053. self.dico_chem_ref_art[r].textChanged.connect(self.changements_phase_5)
  1054. self.dico_com_ref_art[r].textChanged.connect(self.changements_phase_5)
  1055. # ---------- Récup du libellé du bouton sélectionné par l'utilisateur
  1056. self.dico_bout_charg_ref_art[r].released.connect(self.libelle_bouton_ref_art)
  1057. # =====================================================
  1058.  
  1059. def supprimer_ref_artistique(self) :
  1060. '''
  1061. '''
  1062. row = len(self.liste_ref_artistiques) - 1
  1063. if row >= 0:
  1064. for column in range(self.grille_3_stack_5.columnCount()):
  1065. item = self.grille_3_stack_5.itemAtPosition(row, column)
  1066. if item is not None:
  1067. item.widget().deleteLater()
  1068. del self.liste_ref_artistiques[row]
  1069. del self.dico_chem_ref_art[row]
  1070. del self.dico_com_ref_art[row]
  1071. del self.dico_bout_charg_ref_art[row]
  1072.  
  1073. # Le dictionnaire des valeurs de largeur
  1074. # et de hauteur de l'image (en vignette)
  1075. # chargé dans les références artistiques
  1076. # est réactualisé quand quand une ligne
  1077. # est supprimée
  1078. del self.dico_ref_art_w_h_vignettes[row]
  1079.  
  1080. print 'self.dico_ref_art_w_h_vignettes', self.dico_ref_art_w_h_vignettes
  1081.  
  1082. def ajouter_eval(self) :
  1083. '''
  1084. '''
  1085. # Liste des compétences travaillées en classe de 6ème
  1086. liste_c_t_6e = [u"Faites le choix de votre item ici.", u"(E1) Choisir, organiser et mobiliser des gestes, des outils et des matériaux en fonction des effets qu'ils produisent.", \
  1087. u"(E2) Représenter le monde environnant ou donner forme à son imaginaire en explorant divers domaines (dessin, collage, modelage, sculpture, photographie, vidéo...).", \
  1088. u"(E3) Rechercher une expression personnelle en s'éloignant des stéréotypes.", u"(E4) Intégrer l'usage des outils informatiques de travail de l'image et de recherche d'information, au service de la pratique plastique.", \
  1089. u"(P1) Identifier les principaux outils et compétences nécessaires à la réalisation d'un projet artistique.", u"(P2) Se repérer dans les étapes de la réalisation d'une production plastique individuelle ou collective, anticiper les difficultés éventuelles.", \
  1090. u"(P3) Identifier et assumer sa part de responsabilité dans un processus coopératif de création.", u"(P4) Adapter son projet en fonction des contraintes de réalisation et de la prise en compte du spectateur.", \
  1091. u"(A1) Décrire et interroger à l'aide d'un vocabulaire spécifique ses productions plastiques, celles de ses pairs et des oeuvres d'art étudiées en classe.", \
  1092. u"(A2) Justifier des choix pour rendre compte du cheminement qui conduit de l'intention à la réalisation.", \
  1093. u"(A3) Formuler une expression juste de ses émotions, en prenant appui sur ses propres réalisations plastiques, celles des autres élèves et des oeuvres d'art.", \
  1094. u"(R1) Repérer, pour les dépasser, certains a priori et stéréotypes culturels et artistiques.", \
  1095. u"(R2) Identifier quelques caractéristiques qui inscrivent une oeuvre d'art dans une aire géographique ou culturelle et dans un temps historique, contemporain, proche ou lointain.", \
  1096. u"(R3) Décrire des oeuvres d'art, en proposer une compréhension personnelle argumentée."]
  1097. # Liste des compétences travaillées pour les classes de 5ème, 4ème et 3ème
  1098. liste_c_t_5e4e3e = [u"Faites le choix de votre item ici.", u"(E1) Choisir, mobiliser et adapter des langages et des moyens plastiques variés en fonction de leurs effets dans une intention artistique en restant attentif à l'inattendu.", \
  1099. u"(E2) S'approprier des questions artistiques en prenant appui sur une pratique artistique et réflexive.", u"(E3) Recourir à des outils numériques de captation et de réalisation à des fins de création artistique.", \
  1100. u"(E4) Explorer l'ensemble des champs de la pratique plastique et leurs hybridations, notamment avec les pratiques numériques.", \
  1101. u"(E5) Prendre en compte les conditions de la réception de sa production dès la démarche de création, en prêtant attention aux modalités de sa présentation, y compris numérique.", u"(E6) Exploiter des informations et de la documentation, notamment iconique, pour servir un projet de création.", \
  1102. u"(P1) Concevoir, réaliser, donner à voir des projets artistiques, individuels ou collectifs.", u"(P2) Mener à terme une production individuelle dans le cadre d'un projet accompagné par le professeur.", \
  1103. u"(P3) Se repérer dans les étapes de la réalisation d'une production plastique et en anticiper des difficultés éventuelles.", u"(P4) Faire preuve d'autonomie, d'initiative, de responsabilité, d'engagement et d'esprit critique dans la conduite d'un projet artistique.", \
  1104. u"(P5) Confronter intention et réalisation dans la conduite d'un projet pour l'adapter et le réorienter, s'assurer de la dimension artistique de celui-ci.", \
  1105. u"(A1) Dire avec un vocabulaire approprié ce que l'on fait, ressent, imagine, observe, analyse; s'exprimer pour soutenir des intentions artistiques ou une interprétation d'oeuvre.", u"(A2) Établir des liens entre son propre travail, les oeuvres rencontrées ou les démarches observées.", \
  1106. u"(A3) Expliciter la pratique individuelle ou collective, écouter et accepter les avis divers et contradictoires.", u"(A4) Porter un regard curieux et avisé sur son environnement artistique et culturel, proche et lointain, notamment sur la diversité des images fixes et animées, analogiques et numériques.", \
  1107. u"(R1) Reconnaître et connaître des oeuvres de domaines et d'époques variés appartenant au patrimoine national et mondial, en saisir le sens et l'intérêt.", \
  1108. u"(R2) Identifier des caractéristiques (plastiques, culturelles, sémantiques, symboliques) inscrivant une oeuvre d'art dans une aire géographique ou culturelle et dans un temps historique.", u"(R3) Proposer et soutenir l'analyse et l'interprétation d'une oeuvre.", \
  1109. u"(R4) Interroger et situer oeuvres et démarches artistiques du point de vue de l'auteur et de celui du spectateur.", u"(R5) Prendre part au débat suscité par le fait artistique."]
  1110. # Liste des items du domaine du socle
  1111. liste_items_socle = [u"Faites le choix de votre item ici.", u"(D1-1-1-1) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Parler/communiquer/écouter", u"(D1-1-1-2) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Lire", \
  1112. u"(D1-1-1-3) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Ecrire", u"(D1-1-1-4) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Utiliser les règles de la langue", \
  1113. u"(D1-1-1-5) Comprendre, s'exprimer en utilisant la langue française à l'écrit et à l'oral > Apprendre les origines de la langue française", u"(D1-2-2-1) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Pratiquer deux langues", \
  1114. u"(D1-2-2-2) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Comprendre, s'exprimer en langue étrangère", u"(D1-2-2-3) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Dialoguer en langue étrangère" \
  1115. u"(D1-2-2-4) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Adapter le niveau de langue étrangère à la situation", u"(D1-2-2-5) Comprendre, s'exprimer en utilisant une langue étrangère et, les cas échéant, une langue régionale > Communiquer dans le quotidien en langue étrangère", \
  1116. u"(D1-3-3-1) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Utiliser système décimal et langages formels", u"(D1-3-3-2) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Lire les plans, se repérer sur des cartes", \
  1117. u"(D1-3-3-3) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Produire et utiliser des représentations", u"(D1-3-3-4) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Savoir les utilisations des langages informatiques", \
  1118. u"(D1-3-3-5) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Connaître les principes d'algorithmique et de programmation", u"(D1-3-3-6) Comprendre, s'exprimer en utilisant les langages mathématiques, scientifiques et informatiques > Créer des applications simples", \
  1119. u"(D1-4-4-1) Comprendre, s'exprimer en utilisant les langages des arts et du corps > S'exprimer et communiquer par les arts", u"(D1-4-4-2) Comprendre, s'exprimer en utilisant les langages des arts et du corps > Connaître, comprendre les langages artistiques utilisés", \
  1120. u"(D1-4-4-3) Comprendre, s'exprimer en utilisant les langages des arts et du corps > S'exprimer par des activités, physiques, sportives ou artistiques", u"(D2-1-1) Organisation du travail personnel > Anticiper/gérer/mémoriser/planifier", \
  1121. u"(D2-1-2) Organisation du travail personnel > Comprendre des consignes", u"(D2-1-3) Organisation du travail personnel > Mettre en oeuvre les capacités essentielles", u"(D2-1-4) Organisation du travail personnel > Identifier et résoudre un problème", \
  1122. u"(D2-1-5) Organisation du travail personnel > Se constituer des outils personnels", u"(D2-2-1) Coopération et réalisation de projets > Travailler en équipe", u"(D2-2-2) Coopération et réalisation de projets > Gérer un projet", u"(D2-2-3) Coopération et réalisation de projets > Savoir que l'école est un lieu des savoirs", \
  1123. u"(D2-2-4) Coopération et réalisation de projets > Utiliser des outils numériques", u"(D2-3-1) Médias, démarches de recherche et de traitement de l'information > Histoire de l'écrit, modes de production de l'image", u"(D2-3-2) Médias, démarches de recherche et de traitement de l'information > Utiliser des outils de recherche", \
  1124. u"(D2-3-3) Médias, démarches de recherche et de traitement de l'information > Traiter les informations collectées, organiser, mémoriser", ]
  1125.  
  1126. #
  1127. r = len(self.liste_compet_travail_socle_eval)
  1128. #if r >= 0 : self.label_annonce_vocab.hide()
  1129. # Création du combo pour sélection des compétences travaillées
  1130. self.dico_combo_compet_travail[r] = QComboBox()
  1131. self.dico_combo_compet_travail[r].setMaximumWidth(250)
  1132. self.dico_combo_compet_travail[r].setMinimumWidth(250)
  1133. # Création du QTextEdit
  1134. self.dico_traduc_compet_travail[r] = QTextEdit()
  1135. self.dico_traduc_compet_travail[r].setMaximumWidth(280)
  1136. self.dico_traduc_compet_travail[r].setMinimumWidth(280)
  1137. self.dico_traduc_compet_travail[r].setMaximumHeight(54)
  1138. self.dico_traduc_compet_travail[r].setMinimumHeight(54)
  1139. # Création du combo pour sélection du domaine du socle
  1140. self.dico_domaines_du_socle[r] = QComboBox()
  1141. self.dico_domaines_du_socle[r].setMaximumWidth(240)
  1142. self.dico_domaines_du_socle[r].setMinimumWidth(240)
  1143. # ------------------------------
  1144. self.dico_domaines_du_socle[r].addItems(liste_items_socle)
  1145. # ------------------------------
  1146. # Création des spinbox
  1147. self.dico_spinbox_pts_chiffres[r] = QSpinBox()
  1148. self.dico_spinbox_pts_chiffres[r].setRange(0, 60)
  1149. # ------------------------------
  1150. # Conditions de remplissage du combo (cycle 3 ou cycle 4)
  1151. # pour les compétences travaillées
  1152. # ------------------------------
  1153. # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
  1154. if self.classe == 0 :
  1155. message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
  1156. elif self.classe == u'6' :
  1157. self.dico_combo_compet_travail[r].addItems(liste_c_t_6e)
  1158. elif self.classe in [u'5', u'4', u'3']:
  1159. self.dico_combo_compet_travail[r].addItems(liste_c_t_5e4e3e)
  1160. # ------------------------------
  1161. # Répartition dans la grille
  1162. self.grille_3_stack_6.addWidget(self.dico_combo_compet_travail[r], r, 0)
  1163. self.grille_3_stack_6.addWidget(self.dico_traduc_compet_travail[r], r, 1)
  1164. self.grille_3_stack_6.addWidget(self.dico_domaines_du_socle[r], r, 2)
  1165. self.grille_3_stack_6.addWidget(self.dico_spinbox_pts_chiffres[r], r, 3)
  1166. # Ecriture des n°s de lignes
  1167. self.dico_traduc_compet_travail[r].setText(str(r+1)+'. ')
  1168.  
  1169. # Les données sont introduites dans une liste
  1170. self.liste_compet_travail_socle_eval.append([self.dico_combo_compet_travail[r], self.dico_traduc_compet_travail[r], self.dico_domaines_du_socle[r], self.dico_spinbox_pts_chiffres[r]])
  1171.  
  1172. """
  1173. # =====================================================
  1174. # Signaux
  1175. # ---------- Récup des données textuelles
  1176. self.dico_chem_ref_art[r].textChanged.connect(self.changements_phase_5)
  1177. self.dico_com_ref_art[r].textChanged.connect(self.changements_phase_5)
  1178. # ---------- Récup du libellé du bouton sélectionné par l'utilisateur
  1179. self.dico_bout_charg_ref_art[r].released.connect(self.libelle_bouton_ref_art)
  1180. # =====================================================
  1181. """
  1182.  
  1183. def supprimer_eval(self) :
  1184. '''
  1185. '''
  1186. row = len(self.liste_compet_travail_socle_eval) - 1
  1187. if row >= 0:
  1188. for column in range(self.grille_3_stack_6.columnCount()):
  1189. item = self.grille_3_stack_6.itemAtPosition(row, column)
  1190. if item is not None:
  1191. item.widget().deleteLater()
  1192. del self.liste_compet_travail_socle_eval[row]
  1193. del self.dico_combo_compet_travail[row]
  1194. del self.dico_traduc_compet_travail[row]
  1195. del self.dico_domaines_du_socle[row]
  1196. del self.dico_spinbox_pts_chiffres[row]
  1197.  
  1198. def changements_phase_3(self) :
  1199. """
  1200. """
  1201. self.liste_mots_vocabulaire_finale = [[unicode(vocab[0].toPlainText()), unicode(vocab[1].toPlainText())] for vocab in self.liste_mots_vocabulaire]
  1202.  
  1203. print
  1204. print "self.liste_mots_vocabulaire_finale :"
  1205. print
  1206. print self.liste_mots_vocabulaire_finale
  1207. print
  1208.  
  1209. def changements_phase_4(self) :
  1210. """
  1211. """
  1212. self.liste_questions_pos_elev_finale = [unicode(quest.toPlainText()) for quest in self.liste_questions_pos_elev]
  1213.  
  1214. print
  1215. print "self.liste_questions_pos_elev_finale :"
  1216. print
  1217. print self.liste_questions_pos_elev_finale
  1218. print
  1219.  
  1220. def changements_phase_5(self) :
  1221. """
  1222. """
  1223. # Le : \ufffc\n est retiré du chemin de l'image, par le hachage [2:]
  1224. self.liste_ref_artistiques_finale = [[unicode(refart[0].toPlainText())[2:], unicode(refart[1].toPlainText()), unicode(refart[2])] for refart in self.liste_ref_artistiques]
  1225.  
  1226. print
  1227. print "self.liste_ref_artistiques_finale :"
  1228. print
  1229. print self.liste_ref_artistiques_finale
  1230. print
  1231.  
  1232. def libelle_bouton_ref_art(self) :
  1233. '''
  1234. Sélectionner l'id du bouton pressé en vue de
  1235. l'affichage du chemin de l'image sélectionnée
  1236. dans le QTextEdit dédié
  1237. '''
  1238.  
  1239. #
  1240. message_bouton_ref_art = self.sender()
  1241.  
  1242. # Le texte du bouton (par ex pour le bouton n°2) est
  1243. # de la forme : Ouvrir ref 2
  1244. texte_bouton = message_bouton_ref_art.text()
  1245.  
  1246. # On ne sélectionne que le texte comprenant le numéro
  1247. # du bouton
  1248. numero_bouton = texte_bouton.right(2) # Lecture à partir de la droite
  1249.  
  1250. # Si il y a un espace ds la sélection, c'est à dire,
  1251. # par exemple, pour le 3ème bouton on obtiendra " 3",
  1252. # ... si il y 10 boutons, on aura "10" (on se laisse
  1253. # la possibilité de pouvoir sélectionner de 1 à 99
  1254. # boutons)
  1255. if numero_bouton[0:1] == " ": numero_bouton = numero_bouton[1:2]
  1256.  
  1257. # Le numéro du bouton prend le type integer
  1258. numero_bouton = int(numero_bouton)
  1259.  
  1260. # Attribution de l'indice du bouton
  1261. i = numero_bouton - 1
  1262.  
  1263. # =====================================================
  1264. # Signal
  1265. # ---------- Affichage des images/vignettes et chemins images
  1266. self.dico_bout_charg_ref_art[i].clicked.connect(lambda: self.ouvrir_image_boite_ref_art(i))
  1267. # =====================================================
  1268.  
  1269. def ouvrir_image_boite_ref_art(self, n) :
  1270. ''' Fonction pour la boîte de dialogue d'ouverture
  1271. pour charger les différentes oeuvres (références artistiques) '''
  1272.  
  1273. try :
  1274.  
  1275. # La boîte
  1276. ouv_fichier = QFileDialog.getOpenFileName(self, 'Ouvrir une image', os.path.expanduser('~'), 'Images (*.jpg *.jpeg *.JPG *.JPEG *.png *.gif)')
  1277.  
  1278. # Récup du chemin et nom de fichier
  1279. chemin_fichier_ref_art = unicode(ouv_fichier)
  1280.  
  1281. # === Redimensionnnement de l'image pour affichage dans le QTextEdit ======
  1282. # Largeur de la future vignette
  1283. nouv_w = 120
  1284. # Ouverture de l'image
  1285. obImg = Image.open(chemin_fichier_ref_art)
  1286. # Recup dimensions de l'image
  1287. w, h = obImg.size
  1288. # Calcul du ratio de l'image
  1289. ratio = float(w)/float(h)
  1290. # Calcul de future hauteur avec les dimensions donnees par l'utilisateur
  1291. calcHauteur_img = int(float(nouv_w)/ratio)
  1292. # =========================================================================
  1293.  
  1294. # Affichage de l'image dans le QTextEdit
  1295. self.dico_chem_ref_art[n].setHtml('<center><img src="{}" width="{}" height="{}" title="{}" /></center><h6><b>{}</b></h6>'.format(chemin_fichier_ref_art, nouv_w, calcHauteur_img, chemin_fichier_ref_art, chemin_fichier_ref_art))
  1296.  
  1297. # La liste finale des données est réactualisée avec les
  1298. # nouvelles données (le chemin et nom de l'image chargée)
  1299. del self.liste_ref_artistiques_finale[n][0]
  1300. self.liste_ref_artistiques_finale[n].insert(0, chemin_fichier_ref_art)
  1301.  
  1302. # Le dictionnaire est rempli avec les nouvelles données
  1303. # (dans le QTextEdit dédié) de largeur et de hauteur
  1304. # de l'image chargée par l'utilisateur (et ce avec le
  1305. # bouton qu'il faut)
  1306. #if n in self.dico_ref_art_w_h_vignettes.keys() :
  1307. # del self.dico_ref_art_w_h_vignettes[n]
  1308. self.dico_ref_art_w_h_vignettes[n] = (nouv_w, calcHauteur_img)
  1309.  
  1310. print
  1311. print 'self.dico_ref_art_w_h_vignettes', self.dico_ref_art_w_h_vignettes
  1312. print
  1313.  
  1314. except : pass
  1315.  
  1316. def affiche_phases(self,i):
  1317. self.stack.setCurrentIndex(i)
  1318.  
  1319. if __name__ == '__main__':
  1320. app = QApplication(sys.argv)
  1321. matable = EssaiQStackedWidget_Seq_Prof()
  1322. matable.show()
  1323. app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement