Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PyQt] Rafraichir une liste de Qlabel

débutant

    5 novembre 2010 à 9:44:18

    Bonjour,

    Dans mon application ci-dessous, j'ai un bouton recharger qui pour l'instant affiche sous forme de liste de QLabel le contenu du dossier courant (ls -l). La liste des QLabel est le centralWidget d'une QMainWindow et est la liste est contenue dans un QVBoxLayout.

    En fait quand je fais recharger, je ne remplace pas le contenu de mon layout mais j'ajoute des éléments à la suite. Il faudrait que je détruise le layout ou les éléments qu'il contient mais je ne sais pas comment on fait ? J'ai vu dans la doc qu'il y a des fonctions du genre removeWidget mais je ne comprend pas vraiment si elle fait ce que je veux. De plus il y a peut être des choses toutes faites pour rafraîchir une liste.

    Ensuite j'ai deux autres questions :
    1) Si ma liste dans mon QVBoxLayout dépasse la hauteur de la fenêtre et puis de l'écran comment on peut avoir une barre pour qu'on puisse faire défiler la liste ?

    2) Existe t il un QWidget plus adapté à ce genre de chose ?

    Voilà le code :
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import os
    import sys
    from PyQt4.QtGui  import *
    from PyQt4.QtCore import *
    
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    #
    # Classe de la fenetre principale
    #
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    
    class FenetrePrincipale(QMainWindow):
        """ Crée la fenetre principale du programme à partir de la classe Main Window"""
    
        def __init__(self):
            QMainWindow.__init__(self)
    
            # attribut de la fenetre
            self.resize(350, 250)
            self.setWindowTitle("Qstat")
    
            # icone exit
            exit = QAction( "Quitter", self)
            exit.setIcon( QIcon("./img/quit.png") )
            exit.setShortcut("Ctrl+Q")
            self.connect( exit, SIGNAL("triggered()"), qApp, SLOT("quit()") )
    
            # icone recharger
            recharger = QAction( "Recharger", self)
            recharger.setIcon( QIcon("./img/reload.png") )
            recharger.setShortcut("Ctrl+R")
            self.connect( recharger, SIGNAL("triggered()"), self.reloadJobs )
    
            # check box pour chocher son nom
            self.choix_user = QCheckBox( self.lectureUser(), self)
    
            # toolbar
            toolbar = QToolBar("Barre d'outils principale", self)
            toolbar.setMovable(False)
            toolbar.setIconSize(QSize(40,40))
            toolbar.addAction(exit)
            toolbar.addAction(recharger)
            toolbar.addWidget( self.choix_user )
            self.addToolBar( toolbar )
    
            # layout pour les jobs
            self.layoutV = QVBoxLayout()
            listeDesJobs = QWidget()
            listeDesJobs.setLayout(self.layoutV)
            self.setCentralWidget( listeDesJobs )
    
            # affichage initial de la liste des jobs
            self.reloadJobs()
    
        # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    
        def reloadJobs(self):
            """ SLOT pour recharger la liste des jobs """
            labelJobs = self.lectureJobs()
            for label in labelJobs:
                self.layoutV.addWidget( label )
    
        # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    
        def lectureJobs(self):
            """ récupère la liste des jobs """
            lecjobs = os.popen("ls -l")
            jobs = [job[:-1] for job in lecjobs.readlines() ]
            labelJobs = [ QLabel( job, self) for job in jobs ]
            return labelJobs
    
        # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    
        def lectureUser(self):
            """ lit et renvoie le nom de l'utilisateur exécutant l'application """
            whoami = os.popen( "whoami")
            user = whoami.read()
            user = user[:-1]
            return user
    
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    #
    # Fonction principale
    #
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
    
    def main(args):
        """ méthodes main pour démarrer l'application """
        app = QApplication(args)
        fenetre = FenetrePrincipale()
        fenetre.show()
        sys.exit(app.exec_())
    
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    #
    # Lancement du programme
    #
    # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    
    if __name__ == "__main__":
        main(sys.argv)
    


    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2010 à 0:30:17

      Bonjour

      Pour ce qui est de la taille de la fenêtre j'ai trouvé la solution. Il faut placer l'ensemble de la liste des jobs dans une QScrollArea() et le tour est joué.

      Pour ce qui est de raffraichir la liste des QLabels je n'ai pas beaucoup avancé. Si vous avez des idées

      Merci
      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2010 à 1:02:17

        Il y a plus simple: un QFileSystemModel pour remplacer le "ls -l" affiché avec un QListView (au lieu du QVBoxLayout + QLabel) et éventuellement un QFileSystemWatcher pour provoquer la mise à jour automatique de la liste en cas de changement dans le répertoire.
        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2010 à 1:20:46

          Merci je vais regarder tout ça :) !

          Pour ce qui est du ls -l c'est juste pour avoir une liste sur quoi travailler pour développer. A terme, le but est d'afficher une liste donnée par une commande plus complexes.
          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2010 à 9:43:18

            Bonjour

            J'ai résolu mes problèmes, voici les solutions :

            1) pour mettre à jour ma liste de QLabels, dans la fonction reloadJobs, j'ai placé le layout ce qui fait qu'il est détruit (je suppose, vu que la variable est locale) à chaque appel de la fonction.

            2)Pour avoir des barres de défilement quand la liste est plus grande que la fenêtre => QScrollArea

            Dans l'application ici, la QCheckBox ne sert à rien, elle n'a d'intérêt que pour mon application qui ne se contente pas d'un ls -lh :p

            Si vous avez une idée, j'aimerais bien savoir si avec ma fonction reload, je ne crée pas une infinité d'instance. En fait, à chaque appel de reloadJobs, je place un widget dans ma QScrollArea. Je suppose que ce widget vient se placer pardessus le précédent mais je ne sais pas si le précédent est détruit.


            #!/usr/bin/python
            # -*- coding:utf-8 -*-
            
            # qstatQt.py 
            
            __author__  = "Germain Vallverdu <germain.vallverdu@univ-pau.fr>"
            __version__ = "1.0"
            __date__ = "Mercredi 17 Nobembre 2010"
            
            import os
            import sys
            import datetime
            from PyQt4.QtGui  import *
            from PyQt4.QtCore import *
            
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            #
            # Classe de la fenetre principale
            #
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
            class FenetrePrincipale(QMainWindow):
                """ Crée la fenetre principale du programme à partir de la classe Main Window"""
            
                def __init__(self):
                    QMainWindow.__init__(self)
            
                    # attribut de la fenetre
                    hauteur = QDesktopWidget().screenGeometry().height()
                    self.resize( 650, 2*hauteur/3)
                    self.setWindowTitle("Avancement des jobs du cluster")
            
                    # icone exit
                    exit = QAction( "Quitter", self)
                    exit.setIcon( QIcon("./img/quit.png") )
                    exit.setShortcut("Ctrl+Q")
                    self.connect( exit, SIGNAL("triggered()"), qApp, SLOT("quit()") )
            
                    # icone recharger
                    recharger = QAction( "Recharger", self)
                    recharger.setIcon( QIcon("./img/reload.png") )
                    recharger.setShortcut("Ctrl+R")
                    self.connect( recharger, SIGNAL("triggered()"), self.reloadJobs )
            
                    # check box pour chocher son nom et filtrer les jobs
                    self.filtre_user = QCheckBox( self.lectureUser(), self)
                    self.filtre_user.setToolTip("cocher pour n'afficher que ses jobs")
                    self.connect( self.filtre_user, SIGNAL("clicked()"), self.reloadJobs )
            
                    # separateur élastique
                    separateur = QWidget()
                    separateur.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Expanding)
            
                    # A propos
                    apropos = QAction(u"À propos", self)
                    self.connect( apropos, SIGNAL("triggered()"), self.showAPropos )
            
                    # toolbar
                    toolbar = QToolBar("Barre d'outils principale", self)
                    toolbar.setMovable(False)
                    toolbar.setIconSize(QSize(30,30))
                    toolbar.addAction(exit)
                    toolbar.addAction(recharger)
                    toolbar.addWidget( self.filtre_user )
                    toolbar.addWidget(separateur)
                    toolbar.addAction(apropos);
                    self.addToolBar( toolbar )
            
                    # zone centrale de taille ajustable
                    self.listeDesJobsArea = QScrollArea()
                    self.setCentralWidget( self.listeDesJobsArea )
            
                    # affichage initial de la liste des jobs
                    self.reloadJobs()
            
                # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
                def reloadJobs(self):
                    """ SLOT pour recharger la liste des jobs """
            
                    # widget contenant les jobs
                    listeDesJobs = QWidget()
                    layoutV = QVBoxLayout()
                    layoutV.setSpacing(1)
                    listeDesJobs.setLayout(layoutV)
            
                    # titre
                    titre = QLabel()
                    texte = "<table border=0>"
                    texte += "<tr>"
                    texte += "<td align=\"left\"   width=\"200\"> nom </td>"
                    texte += u"<td align=\"left\"   width=\"100\"> propriétaire </td>"
                    texte += "<td align=\"left\"   width=\"100\"> groupe </td>"
                    texte += "<td align=\"left\"   width=\"100\"> taille </td>"
                    texte += "</tr>"
            
                    titre.setText( texte )
                    titre.setFont( QFont("Arial", pointSize=11, weight=QFont.Bold ) )
                    layoutV.addWidget( titre )
            
                    separateur = QLabel()
                    separateur.setLineWidth(2)
                    separateur.setFrameStyle(QFrame.HLine | QFrame.Plain)
                    layoutV.addWidget( separateur )
            
                    # ajout de la liste des jobs
                    labelJobs = self.lectureJobs()
                    for label in labelJobs:
                        layoutV.addWidget( label )
            
                    self.listeDesJobsArea.setWidget( listeDesJobs )
            
                # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
                def lectureJobs(self):
                    """ récupère la liste des jobs """
            
                    # exécute qstat pour avoir la liste des jobs
                    lecjobs = os.popen("ls -lh")
                    jobs = [job[:-1] for job in lecjobs.readlines() ]
                    jobs = jobs[2:]
            
                    # liste des QLabel
                    labelJobs = list()
                    for job in jobs:
                        labelJobs.append( self.formaterJob( job ) )
            
                    return labelJobs
            
                # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
                def formaterJob(self, job ):
                    """ met en forme un job """
            
                    # QLabel contenant le job
                    jobFormater = QLabel()
            
                    # details du job
                    jobDatas = job.split()
            
                    if jobDatas[0][0:1] == "-":
                        jobFormater.setFont( QFont("Arial", pointSize=10) )
                    elif jobDatas[0][0:1] == "d":
                        jobFormater.setFont( QFont("Arial", pointSize=10, weight=QFont.Bold) )
                    else:
                        jobFormater.setFont( QFont("Arial", pointSize=10, italic=True) )
            
                    jobName = jobDatas[7]
                    user    = jobDatas[2]
                    groupe  = jobDatas[3]
                    taille  = jobDatas[4]
            
                    # affichage
                    texte = ""
                    texte += "<table border=0>"
                    texte += "<tr>"
                    texte += "<td align=\"left\"   width=\"200\">"  + jobName      + "</td>"
                    texte += "<td align=\"left\"   width=\"100\">" + user    + "</td>"
                    texte += "<td align=\"left\"   width=\"100\">" + groupe    + "</td>"
                    texte += "<td align=\"left\"   width=\"100\">"  + taille   + "</td>"
                    texte += "</tr>"
            
                    jobFormater.setText( texte )
            
                    return jobFormater
            
                # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
                def lectureUser(self):
                    """ lit et renvoie le nom de l'utilisateur exécutant l'application """
                    whoami = os.popen( "whoami")
                    user = whoami.read()
                    user = user[:-1]
                    return user
            
                # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
                def showAPropos(self):
                    """ affiche la boite de dialoge a propos """
            
                    texte = ""
                    texte += "<h2 align=\"center\">qstatQt  -  version " + str(__version__) + "</h2>"
                    texte += "<p>Interface graphique permettant de suivre l'avancement des calculs \
                    en cours sur le cluster.</p>"
                    texte += "<font size=\"2\">"
                    texte += "<p align=\"center\">" + str(__author__) + "<br/>" + str(__date__) + "</p>"
                    texte += "</font>"
            
                    message = QMessageBox()
                    message.setText( texte )
                    message.setWindowTitle( u"À propos" )
                    message.exec_()
            
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            #
            # Fonction principale
            #
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
            
            def main(args):
                """ méthode main pour démarrer l'application """
            
                app = QApplication(args)
                fenetre = FenetrePrincipale()
                fenetre.show()
                sys.exit(app.exec_())
            
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            #
            # Lancement du programme
            #
            # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            
            if __name__ == "__main__":
                main(sys.argv)
            

            • Partager sur Facebook
            • Partager sur Twitter

            [PyQt] Rafraichir une liste de Qlabel

            × 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