IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Boucle for sur nom QLabel


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Par défaut Boucle for sur nom QLabel
    Bonjour à toutes et à tous !

    Je me pose une question un peu bête mais j'avoue que je coince dessus.

    Je dispose de plusieurs QLabel dans une interface graphique qui forment un "tableau".
    En fonction d'un résultat de calcul j'aimerai changer la couleur de fond de ces QLabels (par ligne entière).
    Les labels concernés ont tous un nom de la forme : label_i, avec i compris entre 4 et 84.

    Tout bêtement je voulais faire une boucle for.
    Et c'est là que j'ai un problème... comment puis-je utiliser un nom d'objet incrémenté par une boucle for ?
    J'ai voulu tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range (4,85) :
                    champ="label_"+str(i)
                    self.champ.setStyleSheet('color: blanc')
    Mais cela ne fonctionne pas, bien entendu, car champ n'est pas un attribut de ma classe.

    Je suis aussi passée par une liste contenant tous mes noms de label :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste_labels=[]
    for i in range (4,85):
        liste_labels.append("label_"+str(i))
    Mais au final ce qui me pose problème c'est d'utiliser le nom incrémenté.

    Ensuite je ne suis pas sure de l'utilisation de setStylesheet pour modifier la couleur de fond. Mais un problème après l'autre.

    En espérant avoir été claire dans mes explications.
    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par Mimisator Voir le message
    Les labels concernés ont tous un nom de la forme : label_i, avec i compris entre 4 et 84.
    Vous vous simplifieriez grandement la vie en mettant ces Labels dans une liste (ou dans un dictionnaire) plutôt que de créer je ne sais combien de variables/attributs.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Par défaut
    Bonsoir,

    Merci d'avoir répondu.

    Citation Envoyé par wiztricks Voir le message
    plutôt que de créer je ne sais combien de variables/attributs.
    Pour la partie création, j'utilise Qt Designer donc pas trop compliqué.

    Par contre je ne vois pas comment cela va m'aider

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce qu'il faut mettre dans la liste, c'est l'adresse du label, et pas son nom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    label1 = QLabel()
    listelabels.append(label1)
    Si on n'a pas besoin de la variable elle-même label1, on peut même s'en passer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listelabels.append(QLabel())
    Après avoir fait ça sur tous les labels, on peut faire la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for label in listelabels:
        label.setText("xxxxx")
        ...

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Comme tu fais ton ui avec le Designer tes widgets ont un attribut objectName qui permet de les retrouver et python a une fonction getattr() qui peut servir aussi.

    Essaye ce code qui montre les deux possibilités
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'labels.ui'
    #
    # Created by: PyQt5 UI code generator 5.10.1
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(201, 96)
            self.gridLayout_2 = QtWidgets.QGridLayout(Form)
            self.gridLayout_2.setObjectName("gridLayout_2")
            self.gridLayout = QtWidgets.QGridLayout()
            self.gridLayout.setObjectName("gridLayout")
            self.label = QtWidgets.QLabel(Form)
            self.label.setText("TextLabel")
            self.label.setObjectName("label")
            self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
            self.label_2 = QtWidgets.QLabel(Form)
            self.label_2.setText("TextLabel")
            self.label_2.setObjectName("label_2")
            self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
            self.label_3 = QtWidgets.QLabel(Form)
            self.label_3.setText("TextLabel")
            self.label_3.setObjectName("label_3")
            self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
            self.label_4 = QtWidgets.QLabel(Form)
            self.label_4.setText("TextLabel")
            self.label_4.setObjectName("label_4")
            self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
            self.pushButton = QtWidgets.QPushButton(Form)
            self.pushButton.setText("Button 1")
            self.pushButton.setObjectName("pushButton")
            self.gridLayout.addWidget(self.pushButton, 2, 0, 1, 1)
            self.pushButton_2 = QtWidgets.QPushButton(Form)
            self.pushButton_2.setText("button 2")
            self.pushButton_2.setObjectName("pushButton_2")
            self.gridLayout.addWidget(self.pushButton_2, 2, 1, 1, 1)
            self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
     
            self.pushButton.clicked.connect(self.on_button_clicked)
            self.pushButton_2.clicked.connect(self.on_button_2_clicked)
     
            self.form = Form
     
        def on_button_clicked(self):
            for i in range(self.gridLayout.count()):
                print(self.gridLayout.itemAt(i).widget().objectName())
     
        def on_button_2_clicked(self):
            for i in range(2, 4):
                name = "label_%s" % i
                w = getattr(self, name)
                print(type(w), w.objectName())
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        Form = QtWidgets.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        Form.show()
        sys.exit(app.exec_())
    Il faut cliquer sur chacun des deux boutons.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses.
    J'ai utilisé la méthode de VinsS pour faire fonctionner mon code.
    Cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     #couleurs utilisées
            blanc=QColor(255, 255, 255)
            vert=QColor(196,215,155)
     
            diametre=self.diametre_entree.text()
     
            try :
                diametre=strdec_to_float(diametre)
            except ValueError :
                self.section_resu.setText('')
                for i in range(4,85):
                    champ="label_%s" %i
                    print(champ)
                    label=getattr(self,champ)
                    color=self.palette()
                    color.setColor(self.backgroundRole(),blanc)
                    label.setPalette(color)                
     
            else :
                section=surfacecercle(diametre)
                self.section_resu.setText("%0.2f" %section)
     
                for i in range(4,85):
                    champ="label_%s" %i
                    print(champ)
                    label=getattr(self,champ)
                    color=self.palette()
                    color.setColor(self.backgroundRole(),vert)
                    label.setPalette(color)
    Ce qui fonctionne parfaitement ! (À terme l'ensemble des cellules ne changera pas de couleur en même temps mais c'était pour le test).

    Encore merci à vous.
    Bonne journée

    PS: Si jamais cela peut servir à quelqu'un d'autre. Pour avoir rencontré le problème il ne faut pas oublier d'appliquer la propriété setAutoFillBackground aux objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.label_4.setAutoFillBackground(True)
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Boucle For sur colonnes
    Par thebigrensky dans le forum VBA Access
    Réponses: 0
    Dernier message: 27/01/2010, 15h52
  2. Boucle FOR sur certaines colonnes
    Par coralie59 dans le forum MATLAB
    Réponses: 1
    Dernier message: 25/02/2009, 11h54
  3. [BASH] boucle for sur des fichiers, recuperation du chemin ?
    Par zevince dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 13/11/2007, 10h47
  4. Boucle for sur fichiers sauf un !
    Par coincoin22 dans le forum Linux
    Réponses: 4
    Dernier message: 13/08/2007, 14h41
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo