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,