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 :

Ajout de spinner pendant un traitement long


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut Ajout de spinner pendant un traitement long
    Bonjour,

    J'ai une interface développée dans QT Designer, qui me permet de sélectionner un fichier et de décoder ce fichier (fichier binaire), et d'afficher le résultat dans un treeview. Mais la lecture prend du temps, donc je voudrais mettre un spinner sur l'interface pendant que python décode la fichier.
    J'ai essayé les Qthread, mais le spinner n'apparait qu'un fois le traitement terminé et j'ai un erreur dans le log.

    Voici mon code :
    L'objet qui sert pour le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class SomeObject(QObject):
     
        finished = pyqtSignal()
     
        def run(self, reader):
            reader.read()
            self.finished.emit()
    Mon objet qui sert à lire le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class s101Reader():
     
        def __init__(self, url: str):
            #QThread.__init__(self, parent)
            self.url = url
            # structure xml
            self.root = ET.Element(basename(self.url))
            # treeview pour l'affichage
            self.treeModel = QtGui.QStandardItemModel()
     
     
        def read(self):
           .....
    Sur l'interface, j'ai un bouton qui permet d'ouvrir la boite de dialogue de sélection d'un fichier et qui lance le traitement de lecture:

    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
     
    from PyQt5 import QtGui, QtCore
    from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QFileDialog, QDialog
    from PyQt5 import uic
     
    from widgets.waitingspinnerwidget import QtWaitingSpinner
    from PyQt5.QtCore import QObject, QThread, pyqtSignal
     
    import sys
    import time
     
    from appModules.s101_reader import s101Reader
    from config import appConfig
    from PyQt5 import QtGui
     
    form_class = uic.loadUiType("S101.ui")[0]
     
    class MyWindowClass(QMainWindow, form_class):
        def __init__(self, parent=None):
            QMainWindow.__init__(self, parent)
            self.setupUi(self)
     
            self.setFixedSize(1050,830)
     
            self.config = appConfig()
     
            self.spinner = QtWaitingSpinner(self)
            self.spinnerLayout.addWidget(self.spinner)
     
        def fileOpen(self):
            filter = "S-101 (*.000)"
            fileName, _ = QFileDialog.getOpenFileName(self, "S-101", "", filter)
            if fileName:
                self.lblFilename.setText(fileName)
                self.txtOutput.append(fileName)
                self.fileName = fileName
     
                self.spinner.start()
     
                self.s101 = s101Reader(fileName)
     
                self.objThread = QThread()
                self.obj = SomeObject()
                self.obj.moveToThread(self.objThread)
                self.obj.finished.connect(self.objThread.quit)
                self.objThread.started.connect(self.obj.run(self.s101))
                objThread.finished.connect(self.spinner.stop())
                self.objThread.start()
     
                self.treeView.setModel(self.s101.treeModel)
                self.treeView.expandToDepth(0)
     
     
        def menuOpenFile_clicked(self):
            self.fileOpen()
    Message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (<class 'TypeError'>, TypeError("argument 1 has unexpected type 'NoneType'"), <traceback object at 0x00000075100D6480>)
    J'ai mis des print pour le debug, la lecture et le decodage du fichier sont ok.
    Qu'est ce que j'ai oublié ?



    Merci,

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    tout d'abord, c'est quoi ça: from widgets.waitingspinnerwidget import QtWaitingSpinner ?
    Si c'est un widget de ta création ne commence pas son nom par Qt.

    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                self.objThread.started.connect(self.obj.run(self.s101))
                objThread.finished.connect(self.spinner.stop())
    D'où sort cet objThread ?

    J'ai déjà créé des widgets d'attente avec PyQt mais jamais je ne suis parvenu à obtenir quelque chose de fluide. Dorénavant je me contente du buzzy cursor.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Le QtWaitingSpinner n'est pas de ma création, je l'ai récupéré ici.

    objThread est un QThread, il manquait effectivement le self dans le code.
    Mais ça ne change rien, le spinner démarre après le chargement de mon fichier...

    Nico

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Essaye en forçant l'affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                self.spinner.start()
                QtCore.QCoreApplication.processEvents()

Discussions similaires

  1. [Débutant] VBNET mise à jour formulaire pendant traitement long
    Par joomy78 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 07/12/2018, 13h28
  2. Fermeture avec traitement long dans le onActivate
    Par benj63 dans le forum C++Builder
    Réponses: 14
    Dernier message: 20/03/2006, 18h54
  3. Réponses: 1
    Dernier message: 28/01/2006, 14h03
  4. [vb.net] Modification d'une winform pendant un traitement
    Par arnolem dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/11/2005, 18h16
  5. Rafraichissement de la fenetre pendant le traitement
    Par Bobx dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/02/2003, 15h13

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