Partage
  • Partager sur Facebook
  • Partager sur Twitter

PyQt5 - ProgressBar refresh

[Animation] ProgressBar ne s'actualise pas correctement, GIF à l'appui

Sujet résolu
    15 novembre 2017 à 3:53:43

    Bonsoir/Bonjour à toutes & à tous,

    Avant de vous décrire ce bug, sachez que j'ai passé plusieurs heures à tenter de le résoudre, en vain; alors un Big Thanks à la personne qui pourra m'aider.

    Je développe actuellement un logiciel de cartoucheur de radio. Cela permet simplement de lancer des jingles/musiques à l'aide de raccourcis clavier afin de créer de jolies transitions à l'antenne.

    Sur le GIF suivant, une musique a été lancé. Les nombres que vous voyez défilez correspondent en pourcentage au temps de lecture de la musique. Comme vous pouvez l'observer, la barre de progression ne s'actualise pas en permanence au fil du temps, mais plutôt par "à coup" et très aléatoirement. Et ce, durant toute la musique.

    J'ai essayé avec un Thread, puis avec QApplication.processEvents(). Toujours le même résultat, la barre ne progresse pas en même temps que le son joué. Pourtant, les calculs en tâche de fond pour avoir le pourcentage fonctionne correctement...

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    import pyglet
    
    class Ui_MainWindow(object):
    
        def playSong(self):
            self.player.play()
    
            while self.player.time < self.src.duration:
                #Calcul du pourcentage de lecture :
                i = ((self.player.time - self.src.duration) / self.src.duration * 100)
                i = 100 - abs(i)
                QApplication.processEvents()
                #On met à jour la valeur de la progressBar
                self.progressBar.setValue(i)
    Quand je remplace self.progressBar.setValue(i) par self.timer.setText(str(i)), la mise à jour de la durée s'effectue parfaitement :

     

    Cette fois-ci, mon code avec un Thread, le résultat est exactement le même :

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
    import pyglet
    
    class ProgressBarThread(QThread):
        progress_update = pyqtSignal(float)
    
        def run(self):
            while self.player.time < self.src.duration:
                i = ((self.player.time - self.src.duration) / self.src.duration * 100)
                i = 100 - abs(i)
                self.progress_update.emit(i)
    
    class Ui_MainWindow(object):
    
        def __init__(self):
            self.progressBarThread = ProgressBarThread()
    
        def playSong(self):
            self.player.play()
            self.progressBarThread.player = self.player
            self.progressBarThread.src = self.src
            self.progressBarThread.start()
            self.progressBarThread.progress_update.connect(self.updateProgressBar)
    
        def updateProgressBar(self, i):
            self.progressBar.setValue(i)

    Démonstration avec un simple code et un step de +5% à chaque boucle :

    for i in range(0,100,5):
        QApplication.processEvents()
        self.progressBar.setValue(i)
        time.sleep(1)

    Résultat :



    N'hésitez pas à me demander si vous avez besoin d'informations supplémentaires qui pourrait vous aider ! J'ai écumé StackOverFlow et autres liens de Google, pas moyen de comprendre...

    Merci ! :)

    -
    Edité par RobinTuffeau 15 novembre 2017 à 4:55:10

    • Partager sur Facebook
    • Partager sur Twitter

    PyQt5 - ProgressBar refresh

    × 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