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

Python Discussion :

QProgressbar avec QThread


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ngénieur d'etat en science géodésique et travaux topographique
    Inscrit en
    Septembre 2016
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : ngénieur d'etat en science géodésique et travaux topographique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2016
    Messages : 152
    Par défaut QProgressbar avec QThread
    salut à tous ; j'ai besoin d'aide pour modifier mon code de telle façon la mise à jour de label se fait au même temps que le progresser change sa valeur
    Nom : thread.PNG
Affichages : 83
Taille : 3,7 Ko

    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
    import sys
    import time
     
    from PyQt5.QtCore import QThread, pyqtSignal
    from PyQt5.QtWidgets import (QApplication, QDialog,QLabel,
                                 QProgressBar, QPushButton)
     
    TIME_LIMIT = 100
     
     
    class External(QThread):
        """
        Runs a counter thread.
        """
        countChanged = pyqtSignal(int)
     
        def run(self):
            count = 0
            while count < TIME_LIMIT:
                count += 1
                time.sleep(1)
                self.countChanged.emit(count)
     
     
    class Actions(QDialog):
        def __init__(self):
            super().__init__()
            self.initUI()
     
        def initUI(self):
            self.setWindowTitle('Mywindow')
            self.setGeometry(255, 255, 310, 80)
            self.progress = QProgressBar(self)
            self.progress.setGeometry(0, 0, 300, 25)
            self.progress.setMaximum(100)
            self.button = QPushButton('Start', self)
            self.button.move(0, 30)
            self.label = QLabel('.......', self)
            self.label.setGeometry(230, 30, 800, 25)
            self.show()
     
            self.button.clicked.connect(self.onButtonClick)
            self.button.clicked.connect(self.update_label)
     
        def update_label(self):
            for i in range (1001):
                k=str(i+5) + " Adv"
                self.label.setText(k)
        def onButtonClick(self):
            self.calc = External()
            self.calc.countChanged.connect(self.onCountChanged)
            self.calc.start()
     
        def onCountChanged(self, value):
            self.progress.setValue(value)
     
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = Actions()
        sys.exit(app.exec_())

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Il y a une section du forum spécialement dédiée à PyQt. Ce serait bien que tu prennes le temps d'explorer le forum, juste pour montrer que tu t'y intéresses un minimum...

    Sinon pour ta question me semble qu'il suffit de modifier le QLabel dans le onCountChanged()
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def onCountChanged(self, value):
    	self.progress.setValue(value)
    	self.label.setText(str(value + 5) + " Adv")
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Homme Profil pro
    ngénieur d'etat en science géodésique et travaux topographique
    Inscrit en
    Septembre 2016
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : ngénieur d'etat en science géodésique et travaux topographique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2016
    Messages : 152
    Par défaut
    Merci Sve@r pour votre réponse;
    mais le problème c'est que la valeur k de label se calcule avec une autre boucle for

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rabeh.ram Voir le message
    mais le problème c'est que la valeur k de label se calcule avec une autre boucle for
    C'est bien évidemment une erreur. Il ne faut pas que le bouton active la boucle (boucle qui en plus ne sert à rien tellement elle est rapide). Il faut que le bouton active le thread, le thread émet des signaux qui sont connectés au onCountChanged qui lui met à jour la progressBar et le label.
    Accessoirement le thread ne doit pas être créé dans le slot mais dans le __init__. Le slot lui ne fait que le lancer.
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import sys
    import time
     
    from PyQt5.QtCore import QThread, pyqtSignal
    from PyQt5.QtWidgets import (QApplication, QDialog,QLabel,
    							 QProgressBar, QPushButton)
     
    TIME_LIMIT = 10
     
     
    class External(QThread):
    	"""
            Runs a counter thread.
            """
    	countChanged = pyqtSignal(int)
     
    	def run(self):
    		count = 0
    		while count < TIME_LIMIT:
    			count += 1
    			time.sleep(1)
    			self.countChanged.emit(count)
     
     
    class Actions(QDialog):
    	def __init__(self):
    		super().__init__()
    		self.initUI()
     
    	def initUI(self):
    		self.setWindowTitle('Mywindow')
    		self.setGeometry(255, 255, 310, 80)
    		self.progress = QProgressBar(self)
    		self.progress.setGeometry(0, 0, 300, 25)
    		self.progress.setMaximum(100)
    		self.button = QPushButton('Start', self)
    		self.button.move(0, 30)
    		self.label = QLabel('.......', self)
    		self.label.setGeometry(230, 30, 800, 25)
     
    		self.button.clicked.connect(self.onButtonClick)
    		self.calc = External()
    		self.calc.countChanged.connect(self.onCountChanged)
    		self.show()
     
    	def onButtonClick(self):
    		self.calc.start()
     
    	def onCountChanged(self, value):
    		self.progress.setValue(value * 100 / TIME_LIMIT)
    		self.label.setText(str(value + 5) + " Adv")
     
     
    if __name__ == "__main__":
    	app = QApplication(sys.argv)
    	window = Actions()
    	sys.exit(app.exec_())
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [QThread] Shell Extensions : avec QThread pour un QTcpSocket
    Par RapotOR dans le forum Multithreading
    Réponses: 1
    Dernier message: 22/02/2014, 17h54
  2. [QThread] QextSerialPort et le multithreading avec QThread
    Par neoirto dans le forum Multithreading
    Réponses: 30
    Dernier message: 26/10/2010, 22h31
  3. [QThread] Problème avec QThread
    Par Crabe05 dans le forum Multithreading
    Réponses: 7
    Dernier message: 21/06/2010, 11h54
  4. Comment declencher une QProgressBar avec un bouton ?
    Par Ninpa dans le forum Débuter
    Réponses: 43
    Dernier message: 03/07/2009, 01h42

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