Forum Programmation.python comment créer une fonction qui a pour argument QTablewidget de PyQt5

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
21
fév.
2020

bonjour;
j'ai dans mon projet plusieurs table-widget (objet de QTablewidget PyQt5). voici un apercu de l'affichage du contenu du tablewidget :
apercu du tablewiget

pour chacune de ces table-widget il ya une fonction qui lui correspond de la forme :
code pour tableWidget_1 :

    tableWidget_1=QTablewidget()
    def intialiser_tableWidget_1 (self):
            self.tableWidget_1.clear() # effacer contenu
            self.tableWidget_1.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
            self.tableWidget_1.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
            self.tableWidget_1.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
            self.tableWidget_1.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))

code pour tableWidget_2 :

    def intialiser_tableWidget_1 (self):
            self.tableWidget_1.clear() # effacer contenu
            self.tableWidget_1.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
            self.tableWidget_1.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
            self.tableWidget_1.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
            self.tableWidget_1.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))

et ainsi de suite.
pour minimiser le nombre de lignes dans mon code, il est recommande que je cree une fonction avec argument, dans laquelle je vais passer ( tableWidget_1 pour argument ) pour tableWidget_1 , et ainsi de suite pour les autres tableWidget.
Pour cela, j'ai fait ceci mais cela ne marche pas :

tableWidget=QTablewidget()
def intialiser_tableWidget (self,tableWidget):
        self.tableWidget.clear() # effacer contenu
        self.tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
        self.tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
        self.tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
        self.tableWidget.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))

merci d'avance, pour toute proposition qui m'aidera a résoudre ce probleme

  • # Je suis pas trop python ...

    Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 08:30.

    Mais …

    Un mot sur la forme dans la question : apparemment, il y a des ``` à plusieurs endroits (pas tous). Mais c'est moche, pour un langage qui repose sur les indentations ! Il ne manquerait pas des lignes vides avant et après les blocs ?

    Ensuite, je suis pas expert Python, loin de là, mais le dernier bloc ne devrait-il pas ressembler à ça plutôt ?

    tableWidget=QTablewidget()
    def intialiser_tableWidget (self,tableWidget):
        tableWidget.clear() # effacer contenu
        tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
        tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
        tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
        tableWidget.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))
    

    Ou alors, il faut ajouter un self.tableWidget=tableWidget au début de la méthode ? Bof …

    Pour terminer, vu qu'on est vendredi, je me permet : Python m'insupporte ! La quantité astronomique de self qu'il faut écrire dans les méthodes des classes, ça rend juste dingue ! Dommage, c'était pas mal. Tant pi …

    Ou alors ?… Nan ??? Ça n'a pas été fait exprès j'espère ?…

  • # POO

    Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 08:40.

    Salut,

    A vue de nez je dirais que c'est normal, et que si tu passes l'objet en paramètre il ne faut plus utiliser self.

    Edit : grillé :)

    PS: aprés s'écrit après

    Matricule 23415

  • # un peu comme les autres

    Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 09:38.

    je ne suis pas développeur python, mais il suffit de changer ta logique

    tableWidget=QTablewidget()
    def intialiser_tableWidget (self,tableWidget):
            self.tableWidget.clear() # effacer contenu
            self.tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
            self.tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
            self.tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
            self.tableWidget.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))

    deviendrait alors

    def creer_tableWidget (parametre):
            parametre=QTablewidget()
            self.parametre.clear() # effacer contenu
            self.parametre.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
            self.parametre.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
            self.parametre.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
            self.parametre.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))

    puis d'appeler plus loin

    creer_tableWidget(monpremiertableau)
    creer_tableWidget(mon2etableau)

    on peut aussi aller plus loin

    en passant le nom des colonnes en paramètres, leur nombre.
    mais ca je te laisse trouver :p

    • [^] # Re: un peu comme les autres

      Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 12:01.

      j'ai modifie la fonction comme ceci :

          #initialiser tableWidget :  
              def intialiser_tableWidget(self,parametre): 
                  parametre=QTableWidget()  
                  parametre.clear()
                  parametre.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
                  parametre.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
                  parametre.setHorizontalHeaderItem(2, QTableWidgetItem("M1 avant cev"))
                  parametre.setHorizontalHeaderItem(3, QTableWidgetItem("M2 avant cev"))

      j'ai une autre fonction que j'ai oublié de mentionner

              def choix_liste(self):
                  if self.radioButton_liste.isChecked()==True :
                      self.label_historique.setText('Historique des correction')           
                      self.intialiser_tableWidget(self.tableWidget_1)
                  elif self.radioButton_liste_confirmees.isChecked()==True :
                      self.label_affichage_historique.setText('Liste des corrections acceptées')
                      self.intialiser_tableWidget(self.tableWidget_1)

      deux radiobutton un pour liste total des corrections, l'autre pour liste des corrections confirmées :

      self.radioButton_liste_correction_confirmees.toggled.connect(self.intialiser_tableWidget_correction)
      self.radioButton_liste_correction.toggled.connect(self.intialiser_tableWidget_correction)

      en faisant le choix de selection par les deux radiobuttons; je remarque que la commande sur le label (self.label_historique.setText) de la fonction (choix_liste) s'effectue, mais l'appel de la fonction (intialiser_tableWidget) en faisant integrer comme argument le nom des tablewiget ne s'effectue pas : ceci est remarque cat le contenu de la tablewidgte ne s'initialise pas comme c'est demande dans la fonction (intialiser_tableWidget)

      je m'excuse une deuxième fois de n'avoir pas bien expliqué mon probleme tout au début

      • [^] # Re: un peu comme les autres

        Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 11:50.

        Salut,

        Es-tu bien sûr de comprendre à quoi réfère le mot-clef self ?

        La fonction choix_liste est définie dans quelle classe qui hérite de quoi ?

        Enfin, regarde l'aide pour poster en markdown, en particulier du code (l'aide mémoire est juste en dessous de la zone de saisie). Avec tes messages, c'est difficile d'aider et un modérateur doit les éditer.

        Matricule 23415

      • [^] # Re: un peu comme les autres

        Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 13:49.

            class MainApp(QMainWindow,Ui_MainWindow) :
                def __init__(self,parent=None) :
                    super(MainApp,self).__init__(parent)
                    QMainWindow.__init__(self)
                    self.setupUi(self)
                    self.win_UI() 
                    self.actions_sur_les_boutons()
                #initialiser tableWidget  :  
                def intialiser_tableWidget(self,parametre): 
                    parametre=QTableWidget()  
                    parametre.clear()
                    parametre.setHorizontalHeaderItem(0, QTableWidgetItem("date"))
                    parametre.setHorizontalHeaderItem(1, QTableWidgetItem("heure"))
                    parametre.setHorizontalHeaderItem(2, QTableWidgetItem("M1"))
                    parametre.setHorizontalHeaderItem(3, QTableWidgetItem("M2"))
        
                def choix_liste(self):
                    if self.radioButton_liste_operations_correction.isChecked()==True :
                        self.label_affichage_historique.setText('Historique des opérations de correction de la ddm faisceau')
                        self.intialiser_tableWidget_correction(self.tableWidget)
                    elif self.radioButton_liste_correction_confirmees.isChecked()==True :
                        self.label_affichage_historique.setText('Liste des corrections acceptées pour la ddm faisceau')
                        self.intialiser_tableWidget_correction(self.tableWidget)
        
                def actions_sur_les_boutons(self):
                    self.radioButton_liste_confirmees.toggled.connect(self.choix_liste)
                    self.radioButton_liste_correction.toggled.connect(self.choix_liste)
        
            def main():
                app=QApplication(sys.argv)
                win=MainApp()
                win.show()
                app.exec_()# infinite loop
            if __name__=='__main__' :
                main()

        ceci est un code minimise

        • [^] # Re: un peu comme les autres

          Posté par  . Évalué à 1. Dernière modification le 21 février 2020 à 12:52.

          Salut,

          ceci est un code minimise

          Ah, merci, on y voit plus clair (manque le python pour la coloration syntaxique, mais c'est vachement mieux :) ).

          A tous les coups, la définition parametre=QTableWidget() ne sort pas du "scope" de la fonction intialiser_tableWidget() (je dis ça presque au pifomètre).

          Voir par exemple ici.

          J'aurais tendance à te proposer une structure plus standard en POO :

          self.ma_table_1 = QTableWidget()
          self.ma_table_2 = QTableWidget()
          # etc, puis :
          intialiser_tableWidget(self.ma_table_1)
          intialiser_tableWidget(self.ma_table_2)

          Et là, ça devrait marcher mieux

          Matricule 23415

          • [^] # Re: un peu comme les autres

            Posté par  . Évalué à 1.

            Et pour ce genre de trucs, sinon, j'ai plutôt recours à des factory, mais dans un premier temps…

            Matricule 23415

          • [^] # Re: un peu comme les autres

            Posté par  . Évalué à 2.

            avec les bonnes balises autour du code, c'est mieux

            ```python
            ton code collé ici
            la suite ici
            ```

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.