Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PyQt4] Supprimer lignes de widget

... et aussi ajouter un QScrollArea

    15 novembre 2017 à 19:55:12

    Bonsoir à tous,

    Je teste pour l'instant le code (afin de l'intégrer dans le futur à une appli que je suis en train de créer).

    Dans la fonction stack_phase_3 le layout est bien crée. Dans l'interface à chaque clic sur le bouton "Ajouter une ligne de vocabulaire", la ligne est bien ajoutée, pas de souci. Après ajout de plusieurs lignes, l'utilisateur est peut-etre amené à en supprimer certaines (bouton "Supprimer une ligne de vocabulaire"), dans un 1er temps ça fonctionne bien ... mais si après la suppression de certaines lignes, on veut de nouveau en rajouter, après appui sur le bouton Ajouter ..., et bien c'est une rafale de lignes qui sont crées ... il y a un souci, je n'arrive pas à savoir d'où ça vient.

    Les fonctions concernées : stack_phase_3, ajouter_un_mot_vocab et supprimer_un_mot_vocab

    De plus je voudrais créer un QScrollArea qui englobe toutes les lignes nouvellement crées et là je ne sais pas comment m'y prendre.

    Pouvez-vous m'aider ?

    Voici le code :

    # -*- coding: utf-8 -*-
    
    #!/usr/bin/python
    #-*- coding: utf-8 -*-
    
    from PyQt4.QtGui import *
    from PyQt4.QtCore import *
    import sys, os
    
    class EssaiQStackedWidget_Seq_Prof(QWidget) :
        # Classe essai QTable Widget
        def __init__(self, parent=None):
            super(EssaiQStackedWidget_Seq_Prof, self).__init__(parent)
    
            self.setWindowTitle("Essai QStackedWidget Seq Prof")
            self.resize(400, 540)
            self.setGeometry(0, 0, 400, 540)
            
            groupe_1 = QGroupBox()
    
            # La liste du menu se fait par 
            # l'intermédiaire d'un QComBoBox
            liste = [u'Phase 1 de construction de la séquence du professeur', u"Phase 2 de construction de la séquence du professeur", u'Phase 3 de construction de la séquence du professeur']
            self.liste_menu = QComboBox()
            self.liste_menu.setMinimumHeight(36)
            self.liste_menu.addItems(liste)
            # ToolTips sur les items de la combo
            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)
            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)
    
            self.w_menu_stack_1 = QWidget()
            self.w_menu_stack_2 = QWidget()
            self.w_menu_stack_3 = QWidget()
    
            self.stack_phase_1()
            self.stack_phase_2()
            self.stack_phase_3()
    
            self.stack = QStackedWidget(self)
            self.stack.addWidget(self.w_menu_stack_1)
            self.stack.addWidget(self.w_menu_stack_2)
            self.stack.addWidget(self.w_menu_stack_3)
    
            hbox = QVBoxLayout(self)
            hbox.addWidget(self.liste_menu)
            hbox.addWidget(self.stack)
    
            self.setLayout(hbox)
            
            self.liste_menu.currentIndexChanged.connect(self.affiche_phases)
    
        def stack_phase_1(self):
            '''
            '''
            # Widgets groupés
            groupe_1 = QGroupBox()
            groupe_2 = QGroupBox()
            
            grid_1 = QGridLayout()
            grid_1.setSpacing(0)
            
            grid_2 = QGridLayout()
            grid_2.setSpacing(0)
            
            # ==========================================
            # Labels Stacked 1
            # ==========================================
            label_classe = QLabel(u"Niveau de classe :")
            label_duree = QLabel(u"Durée :")
            label_sequence = QLabel(u"Séquence n° :")
            label_progression = QLabel(u"Titre progression :")
            label_incitation = QLabel(u"Incitation :")
            label_demande = QLabel(u"Demande :")
            label_notions_abordees = QLabel(u"Notions abordées :")
            label_consignes = QLabel(u"Consignes :")
            label_contraintes = QLabel(u"Contraintes :")
            # ==========================================
            # Widgets Stacked 1
            # ==========================================
            # Cases à cocher pour la sélection du niveau de classe
            self.caseClasse6 = QRadioButton(u"6ème")
            self.caseClasse5 = QRadioButton(u"5ème")
            self.caseClasse4 = QRadioButton(u"4ème")
            self.caseClasse3 = QRadioButton(u"3ème")
            # Drapeau (aucune classe n'est cochée 
            # donc self.classe est à 0)
            self.classe = 0
            # Les lignes de saisie
            self.ligne_duree = QLineEdit()
            self.ligne_sequence = QLineEdit()
            self.ligne_progression = QLineEdit()
            self.ligne_incitation = QLineEdit()
            # Les QTextEdit de saisie
            self.texte_demande = QTextEdit()
            self.texte_demande.setMaximumHeight(100)
            self.texte_demande.setMinimumHeight(100)
            self.texte_notions_abordees = QTextEdit()
            self.texte_notions_abordees.setMaximumHeight(42)
            self.texte_notions_abordees.setMinimumHeight(42)
            self.texte_consignes = QTextEdit()
            self.texte_consignes.setMaximumHeight(70)
            self.texte_consignes.setMinimumHeight(70)
            self.texte_contraintes = QTextEdit()
            self.texte_contraintes.setMaximumHeight(70)
            self.texte_contraintes.setMinimumHeight(70)
    
            # Disposition dans la grille (stacked 1)
            grid_1.addWidget(label_classe, 0, 0)
            grid_1.addWidget(self.caseClasse6, 0, 1)
            grid_1.addWidget(self.caseClasse5, 0, 2)
            grid_1.addWidget(self.caseClasse4, 0, 3)
            grid_1.addWidget(self.caseClasse3, 0, 4)
            
            grid_2.addWidget(label_duree, 1, 0)
            grid_2.addWidget(self.ligne_duree, 1, 1, 1, 4)
            grid_2.addWidget(label_sequence, 2, 0)
            grid_2.addWidget(self.ligne_sequence, 2, 1, 1, 4)
            grid_2.addWidget(label_progression, 3, 0)
            grid_2.addWidget(self.ligne_progression, 3, 1, 1, 4)
            grid_2.addWidget(label_incitation, 4, 0)
            grid_2.addWidget(self.ligne_incitation, 4, 1, 1, 4)
            grid_2.addWidget(label_demande, 5, 0)
            grid_2.addWidget(self.texte_demande, 5, 1, 1, 4)
            grid_2.addWidget(label_notions_abordees, 6, 0)
            grid_2.addWidget(self.texte_notions_abordees, 6, 1, 1, 4)
            grid_2.addWidget(label_consignes, 7, 0)
            grid_2.addWidget(self.texte_consignes, 7, 1, 1, 4)
            grid_2.addWidget(label_contraintes, 8, 0)
            grid_2.addWidget(self.texte_contraintes, 8, 1, 1, 4)
            
            # ============================================= #
            groupe_1.setLayout(grid_1)
            groupe_2.setLayout(grid_2)
    
            layout = QGridLayout()
            layout.setSpacing(4)
            layout.addWidget(groupe_1, 0, 0)
            layout.addWidget(groupe_2, 1, 0)
            # ============================================= #
            
            # Le QStackedWidget englobe et fait apparaître la grille
            # ici la grille layout (qui elle-même englobe le QGroupBox)
            self.w_menu_stack_1.setLayout(layout)
    
            # Initialisation des listes de récup des données
            self.liste_donnees = []
    
            # ==========================================
            # Signaux
            # ==========================================
            # Les cases à cocher QRadioButton 
            self.caseClasse6.toggled.connect(lambda:self.caseEtCombo(self.caseClasse6))
            self.caseClasse5.toggled.connect(lambda:self.caseEtCombo(self.caseClasse5))
            self.caseClasse4.toggled.connect(lambda:self.caseEtCombo(self.caseClasse4))
            self.caseClasse3.toggled.connect(lambda:self.caseEtCombo(self.caseClasse3))
            #
            self.ligne_duree.textChanged.connect(self.changements_phase_1)
            self.ligne_sequence.textChanged.connect(self.changements_phase_1)
            self.ligne_progression.textChanged.connect(self.changements_phase_1)
            self.ligne_incitation.textChanged.connect(self.changements_phase_1)
            #
            self.texte_demande.textChanged.connect(self.changements_phase_1)
            self.texte_notions_abordees.textChanged.connect(self.changements_phase_1)
            self.texte_consignes.textChanged.connect(self.changements_phase_1)
            self.texte_contraintes.textChanged.connect(self.changements_phase_1)
    
        def stack_phase_2(self):
            '''
            '''
            # Widgets groupés
            groupe_1 = QGroupBox()
            groupe_2 = QGroupBox()
            groupe_3 = QGroupBox()
            
            grid_1 = QGridLayout()
            grid_1.setSpacing(0)
            
            grid_2 = QGridLayout()
            grid_2.setSpacing(10)
            
            grid_3 = QGridLayout()
            grid_3.setSpacing(10)    
            
            # ==========================================
            # Labels Stacked 2
            # ==========================================
            label_questionnement = QLabel(u"Questionnement :")
            label_que_vont_app_eleves = QLabel(u"Que vont apprendre\nles élèves :")
            label_question_denseignement = QLabel(u"Question\nd'enseignement :")
            label_entree_princ_prog = QLabel(u"Entrée principale\ndu programme :")
            label_champ_pratiq_plast = QLabel(u"Champ des pratiques\nplastiques :")
            # ==========================================
            # Widgets Stacked 2
            # ==========================================
            self.texte_questionnement = QTextEdit()
            self.texte_questionnement.setMaximumHeight(90)
            self.texte_questionnement.setMinimumHeight(90)
            self.texte_que_vont_app_eleves = QTextEdit()
            self.texte_que_vont_app_eleves.setMaximumHeight(90)
            self.texte_que_vont_app_eleves.setMinimumHeight(90)
            self.texte_question_denseignement = QTextEdit()
            self.texte_question_denseignement.setMaximumHeight(90)
            self.texte_question_denseignement.setMinimumHeight(90)
            # Cases à cocher pour la sélection de
            # l'entrée principale du programme
            self.caseEntr_1_Prog = QRadioButton(u"Cours d'Arts\nPlastiques")
            self.caseEntr_1_Prog.setChecked(True)
            # Drapeau la valeur par défaut est Cours ArtsP quand
            # l'utilisateur n'a pas sélectionné de qradiobutton
            self.entree_principale_prog = u"Cours d'Arts Plastiques"
            print u"Entrée principale du programme :", self.entree_principale_prog
            # Cases à cocher pour l'entrée principale du programme
            self.caseEntr_2_Prog = QRadioButton(u"Hda")
            self.caseEntr_3_Prog = QRadioButton(u"EPI")
            self.caseEntr_4_Prog = QRadioButton(u"PEAC")
            # Cases à cocher pour la sélection du champ des pratiques plastiques
            self.case_prat_plast_1 = QCheckBox(u"Pratiques\nbidimensionnelles")
            self.case_prat_plast_2 = QCheckBox(u"Pratiques\ntridimensionnelles")
            self.case_prat_plast_3 = QCheckBox(u"Pratiques artistiques\nde l'image fixe et\nanimée")
            self.case_prat_plast_4 = QCheckBox(u"Pratiques de la création\nartistique numérique")
    
            # Disposition dans la grille (stacked 2)
            grid_1.addWidget(label_questionnement, 0, 0)
            grid_1.addWidget(self.texte_questionnement, 0, 1, 1, 4)
            grid_1.addWidget(label_que_vont_app_eleves, 1, 0)
            grid_1.addWidget(self.texte_que_vont_app_eleves, 1, 1, 1, 4)
            grid_1.addWidget(label_question_denseignement, 2, 0)
            grid_1.addWidget(self.texte_question_denseignement, 2, 1, 1, 4)
            
            grid_2.addWidget(label_entree_princ_prog, 3, 0)
            grid_2.addWidget(self.caseEntr_1_Prog, 3, 1)
            grid_2.addWidget(self.caseEntr_2_Prog, 3, 2)
            grid_2.addWidget(self.caseEntr_3_Prog, 3, 3)
            grid_2.addWidget(self.caseEntr_4_Prog, 3, 4)
            
            grid_3.addWidget(label_champ_pratiq_plast, 4, 0)
            grid_3.addWidget(self.case_prat_plast_1, 4, 1)
            grid_3.addWidget(self.case_prat_plast_2, 4, 2)
            grid_3.addWidget(self.case_prat_plast_3, 4, 3)
            grid_3.addWidget(self.case_prat_plast_4, 4, 4)
            
            # ============================================= #
            groupe_1.setLayout(grid_1)
            groupe_2.setLayout(grid_2)
            groupe_3.setLayout(grid_3)
    
            layout = QGridLayout()
            layout.setSpacing(4)
            layout.addWidget(groupe_1, 0, 0)
            layout.addWidget(groupe_2, 1, 0)
            layout.addWidget(groupe_3, 2, 0)
            # ============================================= #
            
            # Le QStackedWidget englobe et fait apparaître la grille
            # ici la grille layout (qui elle-même englobe le QGroupBox)
            self.w_menu_stack_2.setLayout(layout)
            
            #
            self.liste_champ_prat_plast = [0, 0, 0, 0]
    
            # ==========================================
            # Signaux
            # ==========================================
            # Les cases à cocher QRadioButton
            self.caseEntr_1_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_1_Prog))
            self.caseEntr_2_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_2_Prog))
            self.caseEntr_3_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_3_Prog))
            self.caseEntr_4_Prog.toggled.connect(lambda:self.entreePrincipaleProg(self.caseEntr_4_Prog))
            #
            self.texte_questionnement.textChanged.connect(self.changements_phase_2)
            self.texte_que_vont_app_eleves.textChanged.connect(self.changements_phase_2)
            self.texte_question_denseignement.textChanged.connect(self.changements_phase_2)
            #
            # Les cases à cocher QCheckBox
            self.case_prat_plast_1.toggled.connect(lambda:self.casePratPlast_1(self.case_prat_plast_1))
            self.case_prat_plast_2.toggled.connect(lambda:self.casePratPlast_2(self.case_prat_plast_2))
            self.case_prat_plast_3.toggled.connect(lambda:self.casePratPlast_3(self.case_prat_plast_3))
            self.case_prat_plast_4.toggled.connect(lambda:self.casePratPlast_4(self.case_prat_plast_4))
            
        def stack_phase_3(self) :
            '''
            '''
            # Widgets groupés
            groupe_1 = QGroupBox()
            groupe_2 = QGroupBox()
            groupe_3 = QGroupBox()
            
            self.grille_1_stack_3 = QGridLayout()
            self.grille_1_stack_3.setSpacing(0)
            self.grille_2_stack_3 = QGridLayout()
            self.grille_2_stack_3.setSpacing(0)
            self.grille_3_stack_3 = QGridLayout()
            self.grille_3_stack_3.setSpacing(0)
            
            # ==========================================
            # Labels Stacked 3
            # ==========================================
            label_annonce = QLabel(u"Pour ajouter (et éditer) des mots de vocabulaire, cliquez sur le bouton <b>Ajouter une ligne de vocabulaire</b>")
            label_mot_vocabulaire = QLabel(u"Mots de vocabulaire")
            label_definitions = QLabel(u"Définitions")
            # ==========================================
            # Widgets Stacked 3
            # ==========================================
            # Bouton pour ajouter une ligne pour les mots de vocabulaire
            self.bouton_ajout_ligne_vocabulaire = QPushButton(u"Ajouter une ligne de vocabulaire")
            # Bouton pour supprimer une ligne pour les mots de vocabulaire
            self.bouton_supprime_ligne_vocabulaire = QPushButton(u"Supprimer une ligne de vocabulaire")
            # La 1ère ligne de QTextEdit
            self.texte_mot_vocab = QTextEdit()
            self.texte_mot_vocab.setMaximumHeight(40)
            self.texte_mot_vocab.setMinimumHeight(40)
            self.texte_mot_vocab.setMaximumWidth(180)
            self.texte_mot_vocab.setMinimumWidth(180)
            self.texte_definition = QTextEdit()
            self.texte_definition.setMaximumHeight(54)
            self.texte_definition.setMinimumHeight(54)
            
            # Disposition dans la grille (stacked 3)
            self.grille_1_stack_3.addWidget(self.bouton_ajout_ligne_vocabulaire, 0, 0)
            self.grille_1_stack_3.addWidget(self.bouton_supprime_ligne_vocabulaire, 0, 1)
            self.grille_1_stack_3.addWidget(label_mot_vocabulaire, 1, 0)
            self.grille_1_stack_3.addWidget(label_definitions, 1, 1)
    
            self.grille_2_stack_3.addWidget(label_mot_vocabulaire, 0, 0, 1, 1)
            self.grille_2_stack_3.addWidget(label_definitions, 0, 1, 1, 1)
            
            #self.grille_3_stack_3.addWidget(label_annonce, 0, 0)
            # ============================================= #
            groupe_1.setLayout(self.grille_1_stack_3)
            groupe_2.setLayout(self.grille_2_stack_3)
            groupe_3.setLayout(self.grille_3_stack_3)
    
            layout = QGridLayout()
            layout.setSpacing(0)
            layout.addWidget(groupe_1, 0, 0)
            layout.addWidget(groupe_2, 1, 0)
            layout.addWidget(groupe_3, 2, 0)
            # ============================================= #
            
            # Le QStackedWidget englobe et fait apparaître la grille
            # ici la grille layout (qui elle-même englobe le QGroupBox)
            self.w_menu_stack_3.setLayout(layout)
            
            # ==========================================
            # Signaux
            # ==========================================
            # Les boutons ajoutent des lignes de questions et peuvent aussi les enlever
            self.bouton_ajout_ligne_vocabulaire.clicked.connect(self.ajouter_un_mot_vocab)
            self.bouton_supprime_ligne_vocabulaire.clicked.connect(self.supprimer_un_mot_vocab)
            
        def caseEtCombo(self, c):
            ''' Fonction de récupération des valeurs des
            cases à cocher pour le niveau de classe '''
            # Sélection des classes et on montre ou on cache
            # les combos (et items contenus) des compétences
            # travaillées
            if c.isChecked() == True :
                self.classe = unicode(c.text()[0])
            else : self.classe = 0
            if self.classe == u"6" :
                print "Niveau de classe :", self.classe
            elif self.classe in [u'5', u'4', u'3']:
                # Drapeau (quand l'utilisateur n'a
                # pas sélectionné de qradiobutton)
                print "Niveau de classe :", self.classe
    
        def changements_phase_1(self) :
            '''
            '''
            # Récup des données
            try : self.duree = unicode(self.ligne_duree.text())
            except : self.duree = u''
            try : self.sequence = unicode(self.ligne_sequence.text())
            except : self.sequence = u''
            try : self.progression = unicode(self.ligne_progression.text())
            except : self.progression = u''
            try : self.incitation = unicode(self.ligne_incitation.text())
            except : self.incitation = u''
            try : self.demande = unicode(self.texte_demande.toPlainText())
            except : self.demande = u''
            try : self.notions = unicode(self.texte_notions_abordees.toPlainText())
            except : self.notions = u''
            try : self.consignes = unicode(self.texte_consignes.toPlainText())
            except : self.consignes = u''
            try : self.contraintes = unicode(self.texte_contraintes.toPlainText())
            except : self.contraintes = u''
            
            # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
            if self.classe == 0 : 
                message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
            
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, self.notions, self.consignes, self.contraintes])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
    
        def entreePrincipaleProg(self, c):
            ''' Fonction de récupération des valeurs des
            cases à cocher pour l'entrée principale du programme '''
            if c.isChecked() == True :
                self.entree_principale_prog = unicode(c.text())
            if self.entree_principale_prog == u"Cours d'Arts\nPlastiques" :
                print u"Entrée principale du programme :", self.entree_principale_prog
            elif self.entree_principale_prog in [u"Hda", u"EPI", u"PEAC"]:
                # Drapeau (quand l'utilisateur n'a
                # pas sélectionné de qradiobutton)
                print u"Entrée principale du programme :", self.entree_principale_prog
                
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
    
        def changements_phase_2(self) :
            '''
            '''
            # Récup des données
            try : self.questionnement = unicode(self.texte_questionnement.toPlainText())
            except : self.questionnement =  u''
            try : self.que_vont_app_eleves = unicode(self.texte_que_vont_app_eleves.toPlainText())
            except : self.que_vont_app_eleves = u''
            try : self.question_denseignement = unicode(self.texte_question_denseignement.toPlainText())
            except : self.question_denseignement =  u''
            
            # Si le niveau de classe (self.classe à 0) n'est pas sélectionné, une boîte de dialogue nous en informe
            if self.classe == 0 : 
                message = QMessageBox.warning(self, u'Message', u"Vous devez sélectionner un niveau de classe avant de continuer !!!", QMessageBox.Ok)
            
            #
            try :
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
            
        # ==============================================================================
        ''' Fonctions de récupération des valeurs. Cases 
        à cocher pour le champ des pratiques plastiques '''
        
        def casePratPlast_1(self, c):
            if c.isChecked() == True :
                self.prat_plast = unicode(c.text())
                if self.prat_plast == u"Pratiques\nbidimensionnelles" :
                    self.prat_plast = u"[x] Pratiques bidimensionnelles"
                    #
                    self.liste_champ_prat_plast[0] = self.prat_plast
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales  
            
        def casePratPlast_2(self, c):
            if c.isChecked() == True :
                self.prat_plast = unicode(c.text())
                if self.prat_plast == u"Pratiques\ntridimensionnelles" :
                    self.prat_plast = u"[x] Pratiques tridimensionnelles"
                    self.liste_champ_prat_plast[1] = self.prat_plast
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
            
        def casePratPlast_3(self, c):
            if c.isChecked() == True :
                self.prat_plast = unicode(c.text())
                if self.prat_plast == u"Pratiques artistiques\nde l'image fixe et\nanimée" :
                    self.prat_plast = u"[x] Pratiques artistiques de l'image fixe et animée"
                    self.liste_champ_prat_plast[2] = self.prat_plast
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
            
        def casePratPlast_4(self, c):
            if c.isChecked() == True :
                self.prat_plast = unicode(c.text())
                if self.prat_plast == u"Pratiques de la création\nartistique numérique" :
                    self.prat_plast = u"[x] Pratiques de la création artistique numérique"
                    self.liste_champ_prat_plast[3] = self.prat_plast
            #
            try : 
                self.liste_donnees.append([self.classe, self.duree, self.sequence, self.progression, self.incitation, self.demande, \
                self.notions, self.consignes, self.contraintes, self.entree_principale_prog, self.questionnement, \
                self.que_vont_app_eleves, self.question_denseignement, self.liste_champ_prat_plast])
                #
                self.liste_donnees_finales = self.liste_donnees[len(self.liste_donnees)-1]
            except : pass
                
            #
            print "self.liste_donnees_finales", self.liste_donnees_finales
        # ==============================================================================
            
        def ajouter_un_mot_vocab(self) :
            '''
            '''
            
            self.dico_vocab = {}
    
            # Liste pour chargement des données 
            # (écriture des textes par l'utilisateur)
            self.liste_mots_vocabulaire = []
            #
            for r in range(self.grille_3_stack_3.rowCount()) :
                QApplication.processEvents()
                # Création des widgets et taille générique
                self.dico_vocab[r] = QTextEdit()
                self.dico_vocab[r+1] = QTextEdit()
                self.dico_vocab[r].setMaximumWidth(180)
                self.dico_vocab[r].setMinimumWidth(180)
                self.dico_vocab[r].setMaximumHeight(54)
                self.dico_vocab[r].setMinimumHeight(54)
                self.dico_vocab[r+1].setMaximumHeight(54)
                self.dico_vocab[r+1].setMinimumHeight(54)
                print 'r', r
                # Conditions de redimensionnement
                if r > 5 :
                    self.dico_vocab[r].setMaximumHeight(34)
                    self.dico_vocab[r].setMinimumHeight(34)
                    self.dico_vocab[r+1].setMaximumHeight(34)
                    self.dico_vocab[r+1].setMinimumHeight(34)
                # Répartition dans la grille
                self.grille_3_stack_3.addWidget(self.dico_vocab[r], r+1, 0)
                self.grille_3_stack_3.addWidget(self.dico_vocab[r+1], r+1, 1)
                # Ecriture des n°s de lignes dans la partie mots de vocabulaire
                self.grille_3_stack_3.addWidget(self.dico_vocab[r].setText(str(r+1)+'. '), r+1, 0)
                # Les données sont introduites dans une liste
                self.liste_mots_vocabulaire.append([self.dico_vocab[r], self.dico_vocab[r+1]])
                # =====================================================
                # Signaux
                self.dico_vocab[r].textChanged.connect(self.changements_phase_3)
                self.dico_vocab[r+1].textChanged.connect(self.changements_phase_3)
                # =====================================================
                
                print 'self.dico_vocab', self.dico_vocab
                 
            print self.liste_mots_vocabulaire
            
        def supprimer_un_mot_vocab(self) :
            '''
            '''
            index = len(self.liste_mots_vocabulaire)-1
            for r in reversed(range(self.grille_3_stack_3.rowCount())) :
                #print "suppr", r
                QApplication.processEvents()
                for c in reversed(range(self.grille_3_stack_3.columnCount())) :
                    QApplication.processEvents()
                    #print "suppr", c, 'index', index
                    layout = self.grille_3_stack_3.itemAtPosition(r, c)
                    #print "suppr layout", layout
                    if layout is not None :
                        QApplication.processEvents()
                        layout.widget().deleteLater()
                        #layout_1.widget().hide()
                        self.grille_3_stack_3.removeItem(layout)
                        #print "index", index
            
            # TRI du dictionnaire (sur la clé)
            # https://www.quennec.fr/trucs-astuces/langages/python/python-trier-le-contenu-dun-dictionnaire-dict          
            #self.dico_vocab = sorted(self.dico_vocab.items(), key=lambda t: t[0])
            #print 'self.dico_vocab TRI', self.dico_vocab
               
            self.liste_mots_vocabulaire.pop() 
            del self.dico_vocab[index+1]  
            print
            
            #print "rowCount apres suppr", self.grille_3_stack_3.rowCount()
            #print "columnCount apres suppr", self.grille_3_stack_3.columnCount()
            #print "self.grille_3_stack_3.count()", self.grille_3_stack_3.count()
            
            print
            print self.dico_vocab
            print self.liste_mots_vocabulaire
            print
            
        def changements_phase_3(self) :
            '''
            '''
            #self.liste_mots_vocabulaire_finale = [[unicode(vocab[0].toPlainText()), unicode(vocab[1].toPlainText())] for vocab in self.liste_mots_vocabulaire if unicode(vocab[0].toPlainText()) != u'' and unicode(vocab[1].toPlainText()) != u'']
            self.liste_mots_vocabulaire_finale = [[unicode(vocab[0].toPlainText()), unicode(vocab[1].toPlainText())] for vocab in self.liste_mots_vocabulaire]
            print
            print "self.liste_mots_vocabulaire_finale :"
            print 
            print self.liste_mots_vocabulaire_finale
            print
    
        def affiche_phases(self,i):
            self.stack.setCurrentIndex(i)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        matable = EssaiQStackedWidget_Seq_Prof()
        matable.show()
        app.exec_()

    Merci d'avance.

    A bientot.

    • Partager sur Facebook
    • Partager sur Twitter

    [PyQt4] Supprimer lignes de widget

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown