Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pyqt5 affichage de widget de manière dynamique

Sujet résolu
    23 mars 2022 à 12:45:12

    Bonjour j'ai un programme qui ajoute des titres de sujet a une liste et ensuit les affiches sur une autre fenêtre, pas défaut la liste contient des titres et quand on clique sur le bouton voir la liste des sujets tout ce passe bien, quand j'ajoute un autre titre via le formulaire le titre est ajouté a la liste qui contient tous mes titres de sujet jusqu'à la aucun souci tous fonctionne bien, mais quand je reclique sur le bouton voir la liste des sujets les modifications ne sont pas prise en compte.

    voici le code:

    # -*- coding: utf-8 -*-
    
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(QtWidgets.QMainWindow):
        
        def __init__(self):
            self.list_subjet = ['titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre', 'titre']
            super().__init__()
            self.setupUi(self)
        
        def page_one(self):
            self.stackedWidget.setCurrentWidget(self.page_list_subjet)
            self.display_subjet()
            
        def page_two(self):
            self.stackedWidget.setCurrentWidget(self.page_create_subjet)
    
        def add_subjet(self):
            subjet = self.lineEdit.text()
            self.list_subjet.append(subjet)
            
        def display_subjet(self):
            self.vbox = QtWidgets.QVBoxLayout()              
            for item in self.list_subjet:
                label = QtWidgets.QLabel(item)
                self.vbox.addWidget(label)
            self.widget.setLayout(self.vbox)
     
            self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
            self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.scroll.setWidgetResizable(True)
            self.scroll.setWidget(self.widget)
            self.setCentralWidget(self.scroll)
            self.setGeometry(600, 100, 300, 300)
            self.setWindowTitle('Scroll Area Demonstration')
            self.show()
            
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(701, 555)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.frame = QtWidgets.QFrame(self.centralwidget)
            self.frame.setGeometry(QtCore.QRect(0, 0, 231, 541))
            self.frame.setStyleSheet("background-color: rgb(255, 255, 255);")
            self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
            self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
            self.frame.setObjectName("frame")
            self.bnt_subjet = QtWidgets.QPushButton(self.frame)
            self.bnt_subjet.clicked.connect(self.page_two)
            self.bnt_subjet.setGeometry(QtCore.QRect(0, 40, 231, 51))
            
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(16)
            self.bnt_subjet.setFont(font)
            self.bnt_subjet.setStyleSheet("background-color: rgb(204, 204, 204);")
            self.bnt_subjet.setObjectName("bnt_subjet")
            self.bnt_subjet_2 = QtWidgets.QPushButton(self.frame)
            self.bnt_subjet_2.clicked.connect(self.page_one)
            self.bnt_subjet_2.setGeometry(QtCore.QRect(-2, 120, 231, 51))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(16)
            self.bnt_subjet_2.setFont(font)
            self.bnt_subjet_2.setStyleSheet("background-color: rgb(204, 204, 204);")
            self.bnt_subjet_2.setObjectName("bnt_subjet_2")
            self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
            self.stackedWidget.setGeometry(QtCore.QRect(230, 0, 471, 521))
            self.stackedWidget.setObjectName("stackedWidget")
            self.page_list_subjet = QtWidgets.QWidget()
            self.page_list_subjet.setObjectName("page_list_subjet")
            self.scroll = QtWidgets.QScrollArea()
            self.scroll.setGeometry(QtCore.QRect(0, 0, 481, 541))
            self.scroll.setWidgetResizable(True)
            self.scroll.setObjectName("scroll")
            self.widget = QtWidgets.QWidget()
            self.widget.setGeometry(QtCore.QRect(0, 0, 479, 539))
            self.widget.setObjectName("widget")
            self.scroll.setWidget(self.widget)
            self.stackedWidget.addWidget(self.page_list_subjet)
            self.page_create_subjet = QtWidgets.QWidget()
            self.page_create_subjet.setObjectName("page_create_subjet")
            self.lineEdit = QtWidgets.QLineEdit(self.page_create_subjet)
            self.lineEdit.setGeometry(QtCore.QRect(110, 50, 231, 31))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(16)
            self.lineEdit.setFont(font)
            self.lineEdit.setObjectName("lineEdit")
            self.bnt_subjet_3 = QtWidgets.QPushButton(self.page_create_subjet)
            self.bnt_subjet_3.clicked.connect(self.add_subjet)
            self.bnt_subjet_3.setGeometry(QtCore.QRect(110, 120, 231, 51))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(16)
            self.bnt_subjet_3.setFont(font)
            self.bnt_subjet_3.setStyleSheet("background-color: rgb(204, 204, 204);")
            self.bnt_subjet_3.setObjectName("bnt_subjet_3")
            self.stackedWidget.addWidget(self.page_create_subjet)
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 701, 21))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            
            
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.bnt_subjet.setText(_translate("MainWindow", "Crée un sujet"))
            self.bnt_subjet_2.setText(_translate("MainWindow", "Voir la liste des sujet "))
            self.lineEdit.setPlaceholderText(_translate("MainWindow", "titre du sujet"))
            self.bnt_subjet_3.setText(_translate("MainWindow", "Ajouter le sujet"))
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    



    -
    Edité par Franck_popo 23 mars 2022 à 13:25:40

    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2022 à 12:50:35

      sans code, ça va être compliqué, mais ça doit avoir un rapport avec le fait qu'une variable n'est pas actualisée avec la liste mise à jour avant ou au moment du clic et/ou de l'affichage des titres.
      • Partager sur Facebook
      • Partager sur Twitter
        23 mars 2022 à 13:26:13

        umfred a écrit:

        sans code, ça va être compliqué, mais ça doit avoir un rapport avec le fait qu'une variable n'est pas actualisée avec la liste mise à jour avant ou au moment du clic et/ou de l'affichage des titres.


        Je vient d'ajouter le code.

        Je vient de modifier la méthode display_subjet et j'ai le résultat que je veut mais je suis obliger de cliquer deux (02) fois sur le bouton voir la liste des sujets. Est-ce que y'a moyen d'y remédier a cela ?

        voici le code modifier:

        def display_subjet(self):
                # Voici les lignes ajouté
                widget_children = self.widget.children()
                for item in widget_children: 
                    item.deleteLater()
                
                self.vbox = QtWidgets.QVBoxLayout()              
                for item in self.list_subjet:
                    label = QtWidgets.QLabel(item)
                    self.vbox.addWidget(label)
                self.widget.setLayout(self.vbox)
         
                self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
                self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self.scroll.setWidgetResizable(True)
                self.scroll.setWidget(self.widget)
                self.setCentralWidget(self.scroll)
                self.setGeometry(600, 100, 300, 300)
                self.setWindowTitle('Scroll Area Demonstration')
                self.show()

        -
        Edité par Franck_popo 23 mars 2022 à 14:15:57

        • Partager sur Facebook
        • Partager sur Twitter
          23 mars 2022 à 15:08:38

          j'ai déplacé la création de vbox (self.vbox = QtWidgets.QVBoxLayout() )dans le corps de setupUI() et ajouter une boucle pour supprimer les widgets en début de disply_subjet(self)

              def display_subjet(self):
                  for i in reversed(range(self.vbox.count())):
                      self.vbox.removeItem(self.vbox.itemAt(i))
                  for item in self.list_subjet:
                      label = QtWidgets.QLabel(item)
                      self.vbox.addWidget(label)
                  self.widget.setLayout(self.vbox)
           
                  self.setGeometry(600, 100, 300, 300)
                  self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
                  self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                  self.scroll.setWidgetResizable(True)
                  self.scroll.setWidget(self.widget)
                  self.setCentralWidget(self.scroll)
                  
                  self.setWindowTitle('Scroll Area Demonstration')
                  self.show()



          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2022 à 16:34:55

            Ok j'essaie et je vous revient. Je vient tester ça fonctionne comme je le voulais, merci encore

            -
            Edité par Franck_popo 23 mars 2022 à 21:19:23

            • Partager sur Facebook
            • Partager sur Twitter

            Pyqt5 affichage de widget de manière dynamique

            × 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