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 :

Affichage d'un label pour patienter [QtGui]


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Géomaticien
    Inscrit en
    Mars 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2005
    Messages : 35
    Points : 26
    Points
    26
    Par défaut Affichage d'un label pour patienter
    Bonjour
    Voila mon soucis, je crée une interface graphique pour lancer mon script principal. Mon soucis étant que lors de l’exécution, il ne se passe rien.
    Pour remédier à cela et que l'utilisateur sache qu'il se passe quelque chose, je voulais afficher un Qlabel lors du clic sur un bouton, puis l'effacer lorsque la fonction m_longueur est terminée.
    Mon problème étant que ce QLabel ne s'affiche que lorsque la fonction m_longueur a terminé ...
    Voici l'extrait de code simplifié utilisé (il s'agit de la fonction lancé au clic d'un bouton) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	def Lancer_iforme(self):
    		#J'affiche mon message pour patienter
    		self.ui.lbl_patience_if.setVisible(True)
    		shp_e = 'truc'
    		shp_s = 'bidule'
    		try:
    			#Je lance ma fonction
    			m_longueur(shp_e,shp_s)
    			#Une boite de dialogue pour spécifier que le traitement est terminé
    			QMessageBox.information(self,"Information",u"Votre calcul est terminé")
    			#Je masque le message pour patienter
    			self.ui.lbl_patience_if.setVisible(False)
    		except:
    			QMessageBox.warning(self,"Warning",u"Un problème est arrivé")
    Sauriez vous pourquoi ?
    En vous remerciant

    Ludovic

  2. #2
    Expert éminent
    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
    Points : 9 294
    Points
    9 294
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    L'instruction que tu donnes (.setVisible(True)) modifie l'affichage, et manifestement, le programme attend de revenir dans la boucle d'attente principale pour en tenir compte.

    Sans garantie, tu peux essayer d'ajouter la ligne suivante pour forcer le rafraichissement (je l'ai déjà utilisée pour un QTextEdit):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    Sinon, pour faire patienter l'utilisateur par un témoin visuel qui bouge, il y a QProgressBar qui marche bien.

    - Quand on sait évaluer le % de progression, la barre l'affiche et avance en fonction.

    - Mais quand on ne sait pas, il y a une option très intéressante: avec un minimum et un maximum tous les 2 à 0, une "chenille" circule en permanence dans la barre.

    Voilà un petit code de test qui montre comment ces 2 options fonctionnent:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # python v2.7
     
    import sys
    from PyQt4 import QtGui, QtCore
     
    class ProgressBar(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
     
            self.setWindowTitle('Petit test de QProgressBar')
     
            self.pbar = QtGui.QProgressBar(self)
     
            self.pbar2 = QtGui.QProgressBar(self)
            self.pbar2.setMinimum(0)
            self.pbar2.setMaximum(0)
     
            self.button = QtGui.QPushButton('Start', self)
            self.connect(self.button, QtCore.SIGNAL('clicked()'), self.onStart)
     
            self.timer = QtCore.QBasicTimer()
            self.step = 0;
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.pbar, 0, 0)
            posit.addWidget(self.pbar2, 1, 0)
            posit.addWidget(self.button, 2, 0)
            self.setLayout(posit)
     
        def timerEvent(self, event):
            if self.step >= 100:
                self.timer.stop()
                return
            self.step = self.step + 1
            self.pbar.setValue(self.step)
     
        def onStart(self):
            if self.timer.isActive():
                self.timer.stop()
                self.button.setText('Start')
            else:
                self.timer.start(100, self)
                self.button.setText('Stop')
     
    app = QtGui.QApplication(sys.argv)
    fen = ProgressBar()
    fen.show()
    app.exec_()
    Tyrtamos

  3. #3
    Nouveau membre du Club
    Profil pro
    Géomaticien
    Inscrit en
    Mars 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2005
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup
    Je connais QProgressBar, je l'utilise par ailleurs mais effectivement comme je ne connaissais pas le pourcentage de progression, j'avais laissé tombé. Donc effectivement la solution QProgressBar m'intéresse beaucoup.
    Quoiqu'il en soit je vais tester les deux solutions.
    Merci

  4. #4
    Nouveau membre du Club
    Profil pro
    Géomaticien
    Inscrit en
    Mars 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2005
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    Bon à priori je n'ai pas résolu mon problème, la QProgressBar est plus esthétique, par contre le problème reste.
    J'ai donc tenté l'insertion de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication.processEvents()
    Placé juste après la tentative d'affichage du QProgressBar ou du QLabel mais rien à faire.
    Est ce que je place correctement le QCoreApplication.processEvents() ?
    Merci à vous

    Ludovic

  5. #5
    Expert éminent
    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
    Points : 9 294
    Points
    9 294
    Billets dans le blog
    6
    Par défaut
    Sinon, regarde du côté de .repaint() appliqué au widget à afficher.

    Tyrtamos

  6. #6
    Nouveau membre du Club
    Profil pro
    Géomaticien
    Inscrit en
    Mars 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2005
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    ok je regarde ça
    Je regarde également du côté des QThread
    Je vous tiens au courant
    Merci

    Ludovic

  7. #7
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Hello,

    Si c'est ceci que tu as fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	def Lancer_iforme(self):
    		#J'affiche mon message pour patienter
    		self.ui.lbl_patience_if.setVisible(True)
                    QtCore.QCoreApplication.processEvents()
    Ca DOIT fonctionner.

    Qu'elle est la durée de la fonction m_longueur ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Géomaticien
    Inscrit en
    Mars 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2005
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    C'est bien ce que j'ai fait, mais non ça n'a pas fonctionné.
    La durée de ma fonction varie. Cette fonction lit un fichier, fait des calculs, puis crée un autre fichier, donc la durée varie en fonction du fichier initial et de sa complexité.
    Avec le fichier que je test, cela dure environ 3 minutes.

    Bon par contre j'ai résolu mon problème en utilisant un QThread pour séparer mon interface de mes calculs.

    Merci à vous

    Ludovic

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2010, 18h59
  2. Affichage des labels pour les courbes
    Par spakhen dans le forum iReport
    Réponses: 6
    Dernier message: 29/07/2009, 16h03
  3. Réponses: 3
    Dernier message: 16/05/2008, 16h16
  4. [C#] CF - Affichage du camembert pour patienter
    Par freddyboy dans le forum Windows Forms
    Réponses: 5
    Dernier message: 11/06/2004, 17h11
  5. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 10h21

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