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 :

[PySide] QProcess ou QThread pour ce cas ?


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [PySide] QProcess ou QThread pour ce cas ?
    Bonjour à tous.

    Je suis un nouveau venu dans le monde de Python (je dev en PHP), et j’essaie de réaliser actuellement ma première application graphique. C’est une application très simple : l’utilisateur choisit un dossier, le programme sélectionne tous les fichiers mp3 présents à l’intérieur et modifie leur tempo grâce à PySox (un binding python de libsox).

    Ma question est simple : Comment procéder pour ne pas geler l’interface graphique pendant que PySox traite les fichiers ?

    J’ai essayé d’utiliser QThread mais ça n’a pas fonctionné. L’interface graphique gelait comme si ça n’avait rien changé. Je me suis dit que j’avais mal procédé alors décidé d’utiliser QProcess (et les soucis qui vont avec, mais c’est une autre histoire).

    Quel procédé est plus adapté à cette situation selon vous ? QThread (ou le threading python)? QProcess (ou le multiprocessing python) ?

    Merci beaucoup par avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Quel procédé est plus adapté à cette situation selon vous ? QThread (ou le threading python)? QProcess (ou le multiprocessing python) ?
    La solution la plus adaptée sera celle, parmi les solutions qui fonctionnent, que vous saurez mettre en place.
    note: Parler de "solutions" suppose avoir examiné le "problème" i.e. ce que fait votre code et un minimum d'analyse des ressources (cpu, disque,...) des opérations pour savoir si on peut se passer de thread ou s'il faut passer par "process" ou "threads".

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

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    QThread marche très bien et permet de réaliser des opérations longues sans geler la partie graphique.

    Une erreur courante au début est d'utiliser la méthode wait (ou join avec threading): c'est elle qui produit le gel de la fenêtre puisque cette méthode bloque l'exécution en attendant la fin du thread.

    Voilà un petit code de test qui montre comment ça marche (Python v2.7, PyQt4). C'est écrit avec PyQt4, mais il devrait être facile de le convertir en PySide (changer au moins l'importation)

    Une subtilité est que le thread ne touche pas directement au graphique. Par contre, il lui envoie des signaux avec des messages. Dans le code ici, on a créé 2 nouveaux signaux: un signal de progression et un signal de fin.

    Cette possibilité d'envoi de signaux me fait préférer QThread à threading, mais on pourrait facilement utiliser threading en faisant les modifs suivantes:
    - faire que la classe du thread hérite en même temps de theading.Thread et de QtCore.QObject: class Operationlongue(threading.Thread, QtCore.QObject),
    - ajouter l'initialisation de QObject dans le __init__: QtCore.QObject.__init__(self, parent),
    - remplacer le drapeau ".isRunning" par ".isAlive".
    - comme on ne peut pas arrêter un thread de threading avec .terminate, il faut le déclarer ".daemon" à son lancement (avant le .start) pour qu'il s'arrête automatiquement à la fermeture de la fenêtre.

    Utilisation type:
    - Un clic sur le bouton "Départ" lance le thread qui exécute l'opération longue.
    - Celui-ci envoie des messages de progression pendant son exécution, ce qui permet la mise à jour de la barre de progression graphique.
    - On peut arrêter le thread avant sa fin normale en cliquant sur le 2ème bouton "Arrêt".
    - A la fin (normale ou pas), le thread envoie un signal de fin pour indiquer à la fenêtre qu'il est terminé (avec un drapeau indiquant si la fin est normale ou pas).

    Dans tous les cas, on voit bien que pendant l'exécution du thread (barre de progression en cours), la fenêtre n'est pas gelée. La preuve: on peut arrêter le thread avant sa fin normale.

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division, print_function, unicode_literals
    # Python 2.7
     
    import sys, os, time
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Operationlongue(QtCore.QThread):
     
        # création des nouveaux signaux
        info = QtCore.pyqtSignal(int) # signal pour une progression
        fini = QtCore.pyqtSignal(bool) # signal pour la fin du thread
     
        #========================================================================
        def __init__(self, parent=None):
            super(Operationlongue, self).__init__(parent)
     
            self.stop = False # drapeau pour signaler l'arrêt demandé
     
        #========================================================================
        def run(self):
            """partie qui s'exécute en tâche de fond"""
            for i in range(0, 101):
                if self.stop:
                    break # arrêt anticipé demandé
                time.sleep(0.05)
                self.info.emit(i) # envoi du signal de progression
            # fin du thread
            self.fini.emit(self.stop) # envoi du signal de fin d'exécution du thread
     
        #========================================================================
        def arreter(self):
            """pour arrêter avant la fin normale d'exécution du thread"""
            self.stop = True
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            # bouton de lancement du thread
            self.depart = QtGui.QPushButton(u"Départ", self)
            self.depart.clicked.connect(self.lancement)
     
            # bouton d'arrêt anticipé du thread
            self.arret = QtGui.QPushButton(u"Arrêt", self)
            self.arret.clicked.connect(self.arreter)
     
            # barre de progression
            self.barre = QtGui.QProgressBar(self)
            self.barre.setRange(0, 100)
            self.barre.setValue(0)
     
            # positionne les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.depart, 0, 0)
            posit.addWidget(self.arret, 1, 0)
            posit.addWidget(self.barre, 2, 0)
            self.setLayout(posit)        
     
            self.operationlongue = None
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def lancement(self, ok=False):
     
            if self.operationlongue==None or not self.operationlongue.isRunning():
                # initialise la barre de progression
                self.barre.reset()
                self.barre.setRange(0, 100)
                self.barre.setValue(0)
                # démarre l'opération longue dans le thread
                self.operationlongue = Operationlongue()
                self.operationlongue.info.connect(self.progression)
                self.operationlongue.fini.connect(self.stop)
                self.operationlongue.start()
     
        #========================================================================
        @QtCore.pyqtSlot(int)
        def progression(self, i):
            """lancé à chaque réception d'info de progression émis par le thread"""
            self.barre.setValue(i)
            QtCore.QCoreApplication.processEvents() # force le rafraichissement
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def arreter(self, ok=False):
            """pour arrêter avant la fin"""
            if self.operationlongue!=None and self.operationlongue.isRunning():
                self.operationlongue.arreter()
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def stop(self, fin_anormale=False):
            """Lancé quand le thread se termine"""
            if fin_anormale:
                # fin anticipée demandée
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Arrêt demandé avant la fin!")
            else:    
            # fin normale
                self.barre.setValue(100)
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Fin normale!")
     
        #========================================================================
        def closeEvent(self, event):
            """lancé à la fermeture de la fenêtre quelqu'en soit la méthode"""
            # si le thread est en cours d'eécution, on l'arrête (brutalement!)
            if self.operationlongue.isRunning():
                self.operationlongue.terminate()
            # et on accepte la fermeture de la fenêtre dans tous les cas
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    Pour ce genre d'utilisation, je préfère les threads aux process: je les trouve plus facile à utiliser.

    [edit] pour convertir ce code PyQt4 en PySide:
    - importation: from PySide import QtCore, QtGui
    - création de signaux: QtCore.Signal au lieu de QtCore.pyqtSignal
    - décorateur pour les méthodes utilisées comme slot: @QtCore.Slot au lieu de @QtCore.pyqtSlot
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Génial ! Merci beaucoup pour ta réponse détaillée tyrtamos. Je suis certain qu’elle va beaucoup m’aider. Le code marche impec chez moi. Je vais tenter d’adapter ça a mon cas.

    Question : Sachant que mon programme traite des fichiers par lots, je dois traiter des fichiers un par un à la suite. Est-il préférable de créer un QThread qui gère la totalité de la liste de fichiers et gère lui-même la boucle, ou devrais-je faire une boucle externe et créer un QThread par fichier traité? (je ne sais pas si ma question est très claire).


    Edit: En fait tyrtamos, si ton code fonctionne parfaitement, cette façon de procéder ne fonctionne pas avec PySox.

    Je vous mets ici le code adapté pour tester une tâche simple réalisée avec PySox dans le thread "OperationLongue". L’UI freeze. Je vous ai commenté le début du code pour les vars à modifier et les dédendances à avoir, si vous voulez tester le code.

    Version PySide:

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
     
    ## But du programme: Modifier le tempo d’un fichier mp3 grace à PySox, tout en gardant l’UI utilisable
    ## Dépendances : pyside, libsox-dev, libsox-fmt-mp3, pysox ( https://pypi.python.org/pypi/pysox/0.3.6.alpha )
     
    ## 2 variables à modifier:
    #### inputFile (ligne 49)
    #### outputFile (ligne 51)
     
    ## Explication du code :
    #### Le bouton depart lance le thread contenant les instructions PySox.
    ######## Ce thread est censé modifier le label_Directory de Fenetre avant de \
    ########		lancer le processus, mais ne le fait qu’une fois la transformation finie
     
    #### Le bouton arret devrait arrêter le thread en route. Mais comment?
     
    ######## PROBLÈME*MAJEUR #########
    ## Pysox ne peut rendre la main. L’UI freeze.
     
     
     
     
    from __future__ import division, print_function, unicode_literals
     
    import sys, os, time
    from PySide import QtCore, QtGui
    import pysox
     
     
     
    #############################################################################
    class Operationlongue(QtCore.QThread):
     
        # création des nouveaux signaux
        info = QtCore.Signal(str) # signal pour une progression
        fini = QtCore.Signal(bool) # signal pour la fin du thread
     
        #========================================================================
        def __init__(self, parent=None):
            super(Operationlongue, self).__init__(parent)
     
            self.stop = False # drapeau pour signaler l'arrêt demandé
     
        #========================================================================
        def run(self):
            ## Prendre un fichier mp3 existant en input (court, de préférence, pour que PySox ne mette pas trop de temps)
            inputFile = "/home/user/mydir/music/input.mp3"
            ## Chemin de la copie qui sortira en output
            outputFile = "/home/user/mydir/music/output.mp3"
            self.info.emit(inputFile)
            soxApp = pysox.CSoxApp(inputFile, outputFile, effectparams=[ ("tempo", [ b'1,2' ]), ])
            soxApp.flow()
            self.fini.emit(self.stop) # envoi du signal de fin d'exécution du thread
     
        #========================================================================
        def arreter(self):
            """pour arrêter avant la fin normale d'exécution du thread"""
            self.stop = True
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            # bouton de lancement du thread
            self.depart = QtGui.QPushButton(u"Départ", self)
            self.depart.clicked.connect(self.lancement)
     
            # bouton d'arrêt anticipé du thread
            self.arret = QtGui.QPushButton(u"Arrêt", self)
            self.arret.clicked.connect(self.arreter)
     
            # Dossier
            self.label_Directory = QtGui.QLabel("Test")
     
            # positionne les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.depart, 0, 0)
            posit.addWidget(self.arret, 1, 0)
            posit.addWidget(self.label_Directory, 2, 0)
            self.setLayout(posit)
     
            self.operationlongue = None
     
     
     
        #========================================================================
        @QtCore.Slot(bool)
        def lancement(self, ok=False):
     
            if self.operationlongue==None or not self.operationlongue.isRunning():
     
                # démarre l'opération longue dans le thread
                self.operationlongue = Operationlongue()
                self.operationlongue.info.connect(self.label_info)
                self.operationlongue.fini.connect(self.stop)
                self.operationlongue.start()
     
        #========================================================================
        @QtCore.Slot(str)
        def label_info(self, inputFile):
            """lancé à chaque réception d'info de progression émis par le thread"""
            self.label_Directory.setText(inputFile)
            QtCore.QCoreApplication.processEvents() # force le rafraichissement
     
        #========================================================================
        @QtCore.Slot(bool)
        def arreter(self, ok=False):
            """pour arrêter avant la fin"""
            if self.operationlongue!=None and self.operationlongue.isRunning():
                self.operationlongue.arreter()
     
        #========================================================================
        @QtCore.Slot(bool)
        def stop(self, fin_anormale=False):
            """Lancé quand le thread se termine"""
            if fin_anormale:
                # fin anticipée demandée
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Arrêt demandé avant la fin!")
            else:
            # fin normale
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Fin normale!")
     
        #========================================================================
        def closeEvent(self, event):
            """lancé à la fermeture de la fenêtre quelqu'en soit la méthode"""
            # si le thread est en cours d'eécution, on l'arrête (brutalement!)
            if self.operationlongue.isRunning():
                self.operationlongue.terminate()
            # et on accepte la fermeture de la fenêtre dans tous les cas
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    Version PyQt4 :

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
     
    ## But du programme: Modifier le tempo d’un fichier mp3 grace à PySox, tout en gardant l’UI utilisable
    ## Dépendances : pyside, libsox-dev, libsox-fmt-mp3, pysox ( https://pypi.python.org/pypi/pysox/0.3.6.alpha )
     
    ## 2 variables à modifier:
    #### inputFile (ligne 49)
    #### outputFile (ligne 51)
     
    ## Explication du code :
    #### Le bouton depart lance le thread contenant les instructions PySox.
    ######## Ce thread est censé modifier le label_Directory de Fenetre avant de \
    ########        lancer le processus, mais ne le fait qu’une fois la transformation finie
     
    #### Le bouton arret devrait arrêter le thread en route. Mais comment?
     
    ######## PROBLÈME*MAJEUR #########
    ## Pysox ne peut rendre la main. L’UI freeze.
     
     
     
     
    from __future__ import division, print_function, unicode_literals
     
    import sys, os, time
    from PyQt4 import QtCore, QtGui
    import pysox
     
     
     
    #############################################################################
    class Operationlongue(QtCore.QThread):
     
        # création des nouveaux signaux
        info = QtCore.pyqtSignal(str) # signal pour une progression
        fini = QtCore.pyqtSignal(bool) # signal pour la fin du thread
     
        #========================================================================
        def __init__(self, parent=None):
            super(Operationlongue, self).__init__(parent)
     
            self.stop = False # drapeau pour signaler l'arrêt demandé
     
        #========================================================================
        def run(self):
            ## Prendre un fichier mp3 existant en input (court, de préférence, pour que PySox ne mette pas trop de temps)
            inputFile = "/home/user/mydir/music/input.mp3"
            ## Chemin de la copie qui sortira en output
            outputFile = "/home/user/mydir/music/output.mp3"
            self.info.emit(inputFile)
            soxApp = pysox.CSoxApp(inputFile, outputFile, effectparams=[ ("tempo", [ b'1,2' ]), ])
            soxApp.flow()
            self.fini.emit(self.stop) # envoi du signal de fin d'exécution du thread
     
        #========================================================================
        def arreter(self):
            """pour arrêter avant la fin normale d'exécution du thread"""
            self.stop = True
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            # bouton de lancement du thread
            self.depart = QtGui.QPushButton(u"Départ", self)
            self.depart.clicked.connect(self.lancement)
     
            # bouton d'arrêt anticipé du thread
            self.arret = QtGui.QPushButton(u"Arrêt", self)
            self.arret.clicked.connect(self.arreter)
     
            # Dossier
            self.label_Directory = QtGui.QLabel("Test")
     
            # positionne les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.depart, 0, 0)
            posit.addWidget(self.arret, 1, 0)
            posit.addWidget(self.label_Directory, 2, 0)
            self.setLayout(posit)
     
            self.operationlongue = None
     
     
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def lancement(self, ok=False):
     
            if self.operationlongue==None or not self.operationlongue.isRunning():
     
                # démarre l'opération longue dans le thread
                self.operationlongue = Operationlongue()
                self.operationlongue.info.connect(self.label_info)
                self.operationlongue.fini.connect(self.stop)
                self.operationlongue.start()
     
        #========================================================================
        @QtCore.pyqtSlot(str)
        def label_info(self, inputFile):
            """lancé à chaque réception d'info de progression émis par le thread"""
            self.label_Directory.setText(inputFile)
            QtCore.QCoreApplication.processEvents() # force le rafraichissement
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def arreter(self, ok=False):
            """pour arrêter avant la fin"""
            if self.operationlongue!=None and self.operationlongue.isRunning():
                self.operationlongue.arreter()
     
        #========================================================================
        @QtCore.pyqtSlot(bool)
        def stop(self, fin_anormale=False):
            """Lancé quand le thread se termine"""
            if fin_anormale:
                # fin anticipée demandée
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Arrêt demandé avant la fin!")
            else:
            # fin normale
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Fin normale!")
     
        #========================================================================
        def closeEvent(self, event):
            """lancé à la fermeture de la fenêtre quelqu'en soit la méthode"""
            # si le thread est en cours d'eécution, on l'arrête (brutalement!)
            if self.operationlongue.isRunning():
                self.operationlongue.terminate()
            # et on accepte la fermeture de la fenêtre dans tous les cas
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Bizarre: ton code sox+pysox fonctionne bien chez moi.

    Je travaille surtout sous Windows, mais pour coller à ton contexte, j'ai pris:
    - linux mint 16 (issu de Ubuntu)
    - python 3.3 avec PySide
    - j'ai bien sox en paquet préinstallé et je l'ai complété par tous les paquets sox disponibles
    - j'ai installé python3-dev, puis le binding pysox comme demandé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    python3 setup.py build
    sudo python3 setup.py install
    J'ai pris ton code (version PySide), et j'ai changé simplement les adresses des fichiers mp3 sans autre modification.

    L'application démarre bien, le traitement se déroule sans freezer le graphique et se termine bien avec le message normal de fin.

    La lecture du fichier mp3 résultant donne bien une version accélérée (c'est marrant).

    Donc: regarde ton installation sox+pysox et/ou donne plus d'info sur ce qui se passe chez toi (messages en console?)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Wow. Alors ça pour être étrange…

    Dans tous les cas merci d’avoir pris le temps de tester chez toi, ça me donne une info précieuse…

    Je t’avoue que je n’ai absolument rien en console comme message, à part à un moment (avant la fin) ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tempo: tempo clipped 16 samples; decrease volume?
    Pour les paquets liés à sox, voici les versions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dpkg -l | grep sox
    ii  libsox-dev:i386                            14.4.1-3ubuntu1                       i386         Development files for the SoX library
    ii  libsox-fmt-all:i386                        14.4.1-3ubuntu1                       i386         All SoX format libraries
    ii  libsox-fmt-alsa:i386                       14.4.1-3ubuntu1                       i386         SoX alsa format I/O library
    ii  libsox-fmt-ao:i386                         14.4.1-3ubuntu1                       i386         SoX Libao format I/O library
    ii  libsox-fmt-base:i386                       14.4.1-3ubuntu1                       i386         Minimal set of SoX format libraries
    ii  libsox-fmt-mp3:i386                        14.4.1-3ubuntu1                       i386         SoX MP2 and MP3 format library
    ii  libsox-fmt-oss:i386                        14.4.1-3ubuntu1                       i386         SoX OSS format I/O library
    ii  libsox-fmt-pulse:i386                      14.4.1-3ubuntu1                       i386         SoX PulseAudio format I/O library
    ii  libsox2:i386                               14.4.1-3ubuntu1                       i386         SoX library of audio effects and processing
    ii  sox                                        14.4.1-3ubuntu1                       i386         Swiss army knife of sound processing
    Pour tout ce qui concerne python (de près ou de loin) j’ai:

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    dpkg -l | grep python
    ii  dh-python                                  1.20140128-1ubuntu8                   all          Debian helper tools for packaging Python libraries and applications
    ii  libpython-dev:i386                         2.7.5-5ubuntu3                        i386         header files and a static library for Python (default)
    ii  libpython-stdlib:i386                      2.7.5-5ubuntu3                        i386         interactive high-level object-oriented language (default python version)
    ii  libpython2.7:i386                          2.7.6-8                               i386         Shared Python runtime library (version 2.7)
    ii  libpython2.7-dev:i386                      2.7.6-8                               i386         Header files and a static library for Python (v2.7)
    ii  libpython2.7-minimal:i386                  2.7.6-8                               i386         Minimal subset of the Python language (version 2.7)
    ii  libpython2.7-stdlib:i386                   2.7.6-8                               i386         Interactive high-level object-oriented language (standard library, version 2.7)
    ii  libpython3-dev:i386                        3.4.0-0ubuntu2                        i386         header files and a static library for Python (default)
    ii  libpython3-stdlib:i386                     3.4.0-0ubuntu2                        i386         interactive high-level object-oriented language (default python3 version)
    ii  libpython3.4:i386                          3.4.0-2ubuntu1                        i386         Shared Python runtime library (version 3.4)
    ii  libpython3.4-dev:i386                      3.4.0-2ubuntu1                        i386         Header files and a static library for Python (v3.4)
    ii  libpython3.4-minimal:i386                  3.4.0-2ubuntu1                        i386         Minimal subset of the Python language (version 3.4)
    ii  libpython3.4-stdlib:i386                   3.4.0-2ubuntu1                        i386         Interactive high-level object-oriented language (standard library, version 3.4)
    ii  python                                     2.7.5-5ubuntu3                        i386         interactive high-level object-oriented language (default version)
    ii  python-appindicator                        12.10.1+13.10.20130920-0ubuntu4       i386         Python bindings for libappindicator
    ii  python-apt                                 0.9.3.5                               i386         Python interface to libapt-pkg
    ii  python-apt-common                          0.9.3.5                               all          Python interface to libapt-pkg (locales)
    ii  python-aptdaemon                           1.1.1-1ubuntu5                        all          Python 2 module for the server and client of aptdaemon
    ii  python-aptdaemon.gtk3widgets               1.1.1-1ubuntu5                        all          Python 2 GTK+ 3 widgets to run an aptdaemon client
    ii  python-cairo                               1.8.8-1ubuntu5                        i386         Python bindings for the Cairo vector graphics library
    ii  python-chardet                             2.0.1-2build2                         all          universal character encoding detector
    ii  python-colorama                            0.2.5-0.1ubuntu1                      all          Cross-platform colored terminal text in Python - Python 2.x
    ii  python-cups                                1.9.66-0ubuntu2                       i386         Python bindings for CUPS
    ii  python-cupshelpers                         1.4.3+20140219-0ubuntu2.1             all          Python modules for printer configuration with CUPS
    ii  python-dbus                                1.2.0-2build2                         i386         simple interprocess messaging system (Python interface)
    ii  python-dbus-dev                            1.2.0-2build2                         all          main loop integration development files for python-dbus
    ii  python-debian                              0.1.21+nmu2ubuntu2                    all          Python modules to work with Debian-related data formats
    ii  python-defer                               1.0.6-2build1                         all          Small framework for asynchronous programming (Python 2)
    ii  python-dev                                 2.7.5-5ubuntu3                        i386         header files and a static library for Python (default)
    ii  python-distlib                             0.1.8-1                               all          low-level components of python distutils2/packaging
    ii  python-gconf                               2.28.1+dfsg-1ubuntu2                  i386         Python bindings for the GConf configuration database system
    ii  python-gi                                  3.12.0-1                              i386         Python 2.x bindings for gobject-introspection libraries
    ii  python-glade2                              2.24.0-3ubuntu3                       i386         GTK+ bindings: Glade support
    ii  python-gnomekeyring                        2.32.0+dfsg-3                         i386         Python bindings for the GNOME keyring library
    ii  python-gobject                             3.12.0-1                              all          Python 2.x bindings for GObject - transitional package
    ii  python-gobject-2                           2.28.6-12build1                       i386         deprecated static Python bindings for the GObject library
    ii  python-gtk2                                2.24.0-3ubuntu3                       i386         Python bindings for the GTK+ widget set
    ii  python-gudev                               147.2-3                               i386         Python bindings for gudev
    ii  python-html5lib                            0.999-2                               all          HTML parser/tokenizer based on the WHATWG HTML5 specification (Python 2)
    ii  python-libxml2                             2.9.1+dfsg1-3ubuntu4.1                i386         Python bindings for the GNOME XML library
    ii  python-minimal                             2.7.5-5ubuntu3                        i386         minimal subset of the Python language (default version)
    ii  python-notify                              0.1.1-3ubuntu2                        i386         Python bindings for libnotify
    ii  python-pexpect                             3.1-1ubuntu0.1                        all          Python module for automating interactive applications
    ii  python-pip                                 1.5.4-1                               all          alternative Python package installer
    ii  python-pkg-resources                       3.3-1ubuntu1                          all          Package Discovery and Resource Access using pkg_resources
    ii  python-psutil                              1.2.1-1ubuntu2                        i386         module providing convenience functions for managing processes
    ii  python-pycurl                              7.19.3-0ubuntu3                       i386         Python bindings to libcurl
    ii  python-pyside                              1.2.1-4build1                         all          Python bindings for Qt4 (big metapackage)
    ii  python-pyside.phonon                       1.2.1-4build1                         i386         Qt 4 Phonon module - Python bindings
    ii  python-pyside.qtcore                       1.2.1-4build1                         i386         Qt 4 core module - Python bindings
    ii  python-pyside.qtdeclarative                1.2.1-4build1                         i386         Qt 4 Declarative module - Python bindings
    ii  python-pyside.qtgui                        1.2.1-4build1                         i386         Qt 4 GUI module - Python bindings
    ii  python-pyside.qthelp                       1.2.1-4build1                         i386         Qt 4 help module - Python bindings
    ii  python-pyside.qtnetwork                    1.2.1-4build1                         i386         Qt 4 network module - Python bindings
    ii  python-pyside.qtopengl                     1.2.1-4build1                         i386         Qt 4 OpenGL module - Python bindings
    ii  python-pyside.qtscript                     1.2.1-4build1                         i386         Qt 4 script module - Python bindings
    ii  python-pyside.qtsql                        1.2.1-4build1                         i386         Qt 4 SQL module - Python bindings
    ii  python-pyside.qtsvg                        1.2.1-4build1                         i386         Qt 4 SVG module - Python bindings
    ii  python-pyside.qttest                       1.2.1-4build1                         i386         Qt 4 test module - Python bindings
    ii  python-pyside.qtuitools                    1.2.1-4build1                         i386         Qt 4 UI tools module - Python bindings
    ii  python-pyside.qtwebkit                     1.2.1-4build1                         i386         Qt 4 WebKit module - Python bindings
    ii  python-pyside.qtxml                        1.2.1-4build1                         i386         Qt 4 XML module - Python bindings
    ii  python-pysqlite2                           2.6.3-3                               i386         Python interface to SQLite 3
    ii  python-qt4                                 4.10.4+dfsg-1ubuntu1                  i386         Python bindings for Qt4
    ii  python-requests                            2.2.1-1                               all          elegant and simple HTTP library for Python, built for human beings
    ii  python-setuptools                          3.3-1ubuntu1                          all          Python Distutils Enhancements (setuptools compatibility)
    ii  python-sip                                 4.15.5-1build1                        i386         Python/C++ bindings generator runtime library
    ii  python-six                                 1.5.2-1                               all          Python 2 and 3 compatibility library (Python 2 interface)
    ii  python-smbc                                1.0.14.1-0ubuntu2                     i386         Python bindings for Samba clients (libsmbclient)
    ii  python-support                             1.0.15                                all          automated rebuilding support for Python modules
    ii  python-talloc                              2.1.0-1                               i386         hierarchical pool based memory allocator - Python bindings
    ii  python-urllib3                             1.7.1-1build1                         all          HTTP library with thread-safe connection pooling for Python
    ii  python-vte                                 1:0.28.2-5ubuntu1                     i386         Python bindings for the VTE widget set
    ii  python-xdg                                 0.25-4                                all          Python 2 library to access freedesktop.org standards
    ii  python2.7                                  2.7.6-8                               i386         Interactive high-level object-oriented language (version 2.7)
    ii  python2.7-dev                              2.7.6-8                               i386         Header files and a static library for Python (v2.7)
    ii  python2.7-minimal                          2.7.6-8                               i386         Minimal subset of the Python language (version 2.7)
    ii  python3                                    3.4.0-0ubuntu2                        i386         interactive high-level object-oriented language (default python3 version)
    ii  python3-apport                             2.14.1-0ubuntu3.2                     all          Python 3 library for Apport crash report handling
    ii  python3-apt                                0.9.3.5                               i386         Python 3 interface to libapt-pkg
    ii  python3-aptdaemon                          1.1.1-1ubuntu5                        all          Python 3 module for the server and client of aptdaemon
    ii  python3-aptdaemon.gtk3widgets              1.1.1-1ubuntu5                        all          Python 3 GTK+ 3 widgets to run an aptdaemon client
    ii  python3-chardet                            2.0.1-1                               all          universal encoding detector
    ii  python3-colorama                           0.2.5-0.1ubuntu1                      all          Cross-platform colored terminal text in Python - Python 3.x
    ii  python3-commandnotfound                    0.3ubuntu12                           all          Python 3 bindings for command-not-found.
    ii  python3-dbus                               1.2.0-2build2                         i386         simple interprocess messaging system (Python 3 interface)
    ii  python3-debian                             0.1.21+nmu2ubuntu2                    all          Python 3 modules to work with Debian-related data formats
    ii  python3-defer                              1.0.6-2build1                         all          Small framework for asynchronous programming (Python 3)
    ii  python3-dev                                3.4.0-0ubuntu2                        i386         header files and a static library for Python (default)
    ii  python3-distlib                            0.1.8-1                               all          low-level components of python distutils2/packaging
    ii  python3-distupgrade                        1:0.220.2                             all          manage release upgrades
    ii  python3-gdbm:i386                          3.4.0-0ubuntu1                        i386         GNU dbm database support for Python 3.x
    ii  python3-gi                                 3.12.0-1                              i386         Python 3 bindings for gobject-introspection libraries
    ii  python3-html5lib                           0.999-2                               all          HTML parser/tokenizer based on the WHATWG HTML5 specification (Python 3)
    ii  python3-minimal                            3.4.0-0ubuntu2                        i386         minimal subset of the Python language (default python3 version)
    ii  python3-packagekit                         0.8.12-1ubuntu5                       all          PackageKit backend Python bindings
    ii  python3-pip                                1.5.4-1                               all          alternative Python package installer - Python 3 version of the package
    ii  python3-pkg-resources                      3.3-1ubuntu1                          all          Package Discovery and Resource Access using pkg_resources
    ii  python3-problem-report                     2.14.1-0ubuntu3.2                     all          Python 3 library to handle problem reports
    ii  python3-pycurl                             7.19.3-0ubuntu3                       i386         Python 3 bindings to libcurl
    ii  python3-pyqt4                              4.10.4+dfsg-1ubuntu1                  i386         Python3 bindings for Qt4
    ii  python3-pyside                             1.2.1-4build1                         all          Python3 bindings for Qt4 (big metapackage)
    ii  python3-pyside.phonon                      1.2.1-4build1                         i386         Qt 4 Phonon module - Python3 bindings
    ii  python3-pyside.qtcore                      1.2.1-4build1                         i386         Qt 4 core module - Python3 bindings
    ii  python3-pyside.qtdeclarative               1.2.1-4build1                         i386         Qt 4 Declarative module - Python3 bindings
    ii  python3-pyside.qtgui                       1.2.1-4build1                         i386         Qt 4 GUI module - Python3 bindings
    ii  python3-pyside.qthelp                      1.2.1-4build1                         i386         Qt 4 help module - Python3 bindings
    ii  python3-pyside.qtnetwork                   1.2.1-4build1                         i386         Qt 4 network module - Python3 bindings
    ii  python3-pyside.qtopengl                    1.2.1-4build1                         i386         Qt 4 OpenGL module - Python3 bindings
    ii  python3-pyside.qtscript                    1.2.1-4build1                         i386         Qt 4 script module - Python3 bindings
    ii  python3-pyside.qtsql                       1.2.1-4build1                         i386         Qt 4 SQL module - Python3 bindings
    ii  python3-pyside.qtsvg                       1.2.1-4build1                         i386         Qt 4 SVG module - Python3 bindings
    ii  python3-pyside.qttest                      1.2.1-4build1                         i386         Qt 4 test module - Python3 bindings
    ii  python3-pyside.qtuitools                   1.2.1-4build1                         i386         Qt 4 UI tools module - Python3 bindings
    ii  python3-pyside.qtwebkit                    1.2.1-4build1                         i386         Qt 4 WebKit module - Python3 bindings
    ii  python3-pyside.qtxml                       1.2.1-4build1                         i386         Qt 4 XML module - Python3 bindings
    ii  python3-requests                           2.2.1-1                               all          elegant and simple HTTP library for Python3, built for human beings
    ii  python3-setuptools                         3.3-1ubuntu1                          all          Python3 Distutils Enhancements (setuptools compatibility)
    ii  python3-sip                                4.15.5-1build1                        i386         Python 3/C++ bindings generator runtime library
    ii  python3-six                                1.5.2-1                               all          Python 2 and 3 compatibility library (Python 3 interface)
    ii  python3-software-properties                0.92.37.1                             all          manage the repositories that you install software from
    ii  python3-tk                                 3.4.0-0ubuntu1                        i386         Tkinter - Writing Tk applications with Python 3.x
    ii  python3-uno                                1:4.2.3~rc3-0ubuntu2                  i386         Python-UNO bridge
    ii  python3-update-manager                     1:0.196.12                            all          python 3.x module for update-manager
    ii  python3-urllib3                            1.7.1-1build1                         all          HTTP library with thread-safe connection pooling for Python3
    ii  python3-xkit                               0.5.0ubuntu2                          all          library for the manipulation of xorg.conf files (Python 3)
    ii  python3.4                                  3.4.0-2ubuntu1                        i386         Interactive high-level object-oriented language (version 3.4)
    ii  python3.4-dev                              3.4.0-2ubuntu1                        i386         Header files and a static library for Python (v3.4)
    ii  python3.4-minimal                          3.4.0-2ubuntu1                        i386         Minimal subset of the Python language (version 3.4)
    Je tourne sous Lubuntu 14.04, mais j’ai réinstallé récemment. Le problème était le même sous Xubuntu 12.04. Il faudra que j’essaie avec Mint en machine virtuelle pour voir ce que ça donne… Mais tout ça semble tout de même très étrange.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    tyrtamos, je dois avoir un problème à un niveau plus hardware alors…

    Je viens de tester sous Mint 16, et c’est exactement la même chose. L’UI freeze complètement, et je dois faire un xkill si je veux arrêter le programme.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Einenlum Voir le message
    Je viens de tester sous Mint 16, et c’est exactement la même chose. L’UI freeze complètement, et je dois faire un xkill si je veux arrêter le programme.
    Le code posté par Tyrtamos fonctionnait avant que vous y intégrer vos appels à pysox.
    Pas possible de tester "ailleurs" avec vos fichiers audio.
    Que donne le code pysox "hors tout", i.e. un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import pysox
    def foo():
            inputFile = "/home/user/mydir/music/input.mp3"
            ## Chemin de la copie qui sortira en output
            outputFile = "/home/user/mydir/music/output.mp3"
            soxApp = pysox.CSoxApp(inputFile, outputFile, effectparams=[ ("tempo", [ b'1,2' ]), ])
            soxApp.flow()
    foo()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour wiztricks, merci pour ta réponse.

    Je n’ai pas compris ce passage:

    Citation Envoyé par wiztricks Voir le message
    Pas possible de tester "ailleurs" avec vos fichiers audio.
    N’importe quel mp3 convient pour le test.

    Que donne le code pysox "hors tout"
    Le code suivant marche très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import pysox
     
    def foo():
            inputFile = "/foo/bar/input.mp3"
            ## Chemin de la copie qui sortira en output
            outputFile = "/foo/bar/output.mp3"
            soxApp = pysox.CSoxApp(inputFile, outputFile, effectparams=[ ("tempo", [ b'1.2' ]), ])
            soxApp.flow()
    foo()
    Le problème n’est pas pysox en soi. Il fait la tâche tel qu’on lui demande. Le problème c’est qu’il ne "rend" pas la main à l’UI. PySox fait bien le boulot demandé pendant que l’UI freeze.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Up ?

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Au cas où, je te redonne la copie exacte du code qui marche chez moi (Python 3.3, PySide, linux mint16):

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3.3 
     
    import sys, os, time
    from PySide import QtCore, QtGui
    import pysox
     
    #############################################################################
    class Operationlongue(QtCore.QThread):
     
        # création des nouveaux signaux
        info = QtCore.Signal(str) # signal pour une progression
        fini = QtCore.Signal(bool) # signal pour la fin du thread
     
        #========================================================================
        def __init__(self, parent=None):
            super(Operationlongue, self).__init__(parent)
     
            self.stop = False # drapeau pour signaler l'arrêt demandé
     
        #========================================================================
        def run(self):
            ## Prendre un fichier mp3 existant en input (court, de préférence, pour que PySox ne mette pas trop de temps)
            inputFile = "/home/tyrtamos/Musique/13 Derezzed.mp3"
            ## Chemin de la copie qui sortira en output
            outputFile = "/home/tyrtamos/Musique/13 Derezzed_plusvite.mp3"
            self.info.emit(inputFile)
            soxApp = pysox.CSoxApp(inputFile, outputFile, effectparams=[ ("tempo", [ b'1,2' ]), ])
            soxApp.flow()
            self.fini.emit(self.stop) # envoi du signal de fin d'exécution du thread
     
        #========================================================================
        def arreter(self):
            """pour arrêter avant la fin normale d'exécution du thread"""
            self.stop = True
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
            # bouton de lancement du thread
            self.depart = QtGui.QPushButton(u"Départ", self)
            self.depart.clicked.connect(self.lancement)
     
            # bouton d'arrêt anticipé du thread
            self.arret = QtGui.QPushButton(u"Arrêt", self)
            self.arret.clicked.connect(self.arreter)
     
            # Dossier
            self.label_Directory = QtGui.QLabel("Test")
     
            # positionne les widgets dans la fenêtre
            posit = QtGui.QGridLayout()
            posit.addWidget(self.depart, 0, 0)
            posit.addWidget(self.arret, 1, 0)
            posit.addWidget(self.label_Directory, 2, 0)
            self.setLayout(posit)
     
            self.operationlongue = None
     
        #========================================================================
        @QtCore.Slot(bool)
        def lancement(self, ok=False):
     
            if self.operationlongue==None or not self.operationlongue.isRunning():
                # démarre l'opération longue dans le thread
                self.operationlongue = Operationlongue()
                self.operationlongue.info.connect(self.label_info)
                self.operationlongue.fini.connect(self.stop)
                self.operationlongue.start()
     
        #========================================================================
        @QtCore.Slot(str)
        def label_info(self, inputFile):
            """lancé à chaque réception d'info de progression émis par le thread"""
            self.label_Directory.setText(inputFile)
            QtCore.QCoreApplication.processEvents() # force le rafraichissement
     
        #========================================================================
        @QtCore.Slot(bool)
        def arreter(self, ok=False):
            """pour arrêter avant la fin"""
            if self.operationlongue!=None and self.operationlongue.isRunning():
                self.operationlongue.arreter()
     
        #========================================================================
        @QtCore.Slot(bool)
        def stop(self, fin_anormale=False):
            """Lancé quand le thread se termine"""
            if fin_anormale:
                # fin anticipée demandée
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Arrêt demandé avant la fin!")
            else:
            # fin normale
                QtGui.QMessageBox.information(self,
                    u"Opération longue",
                    u"Fin normale!")
     
        #========================================================================
        def closeEvent(self, event):
            """lancé à la fermeture de la fenêtre quelqu'en soit la méthode"""
            # si le thread est en cours d'eécution, on l'arrête (brutalement!)
            if self.operationlongue.isRunning():
                self.operationlongue.terminate()
            # et on accepte la fermeture de la fenêtre dans tous les cas
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    Je viens de réessayer plusieurs fois: ça marche à chaque fois.

    j'ai essayé de lancer à partir d'eclipse+pydev, et à partir de la console: pas de problème dans les 2 cas.

    En console, j'ai un message: "tempo: tempo clipped 3 samples; decrease volume?", mais je ne sais pas ce que c'est. La question apparait avec la petite fenêtre de fin normale. Je n'y réponds pas, et ça n'empêche pas le bon fonctionnement.

    Une suggestion pour déverminer: essai de placer des print ou des messagebox à chaque étape, voire à chaque ligne, pour trouver à quel endroit ça bloque. Ou utilise un outil de debugging.

    NB: je ne pourrai plus te répondre, ou par épisode: je suis en voyage quelques temps.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 8
    Dernier message: 23/06/2009, 20h31
  2. Demande d'aide pour un cas désespéré
    Par diaruga dans le forum Emploi
    Réponses: 14
    Dernier message: 09/06/2009, 09h44
  3. Réponses: 1
    Dernier message: 12/06/2008, 16h46
  4. Que mettre dans un champ DATETIME pour certains cas?
    Par Jim_Nastiq dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/07/2006, 10h22
  5. [Langage] Quel langage utilisé pour ce cas : l'active directory ?
    Par pogy dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 10/05/2006, 11h11

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