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 :
Mon objet qui sert à lire le fichier :
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()
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 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): .....
Message d'erreur :
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()
J'ai mis des print pour le debug, la lecture et le decodage du fichier sont ok.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (<class 'TypeError'>, TypeError("argument 1 has unexpected type 'NoneType'"), <traceback object at 0x00000075100D6480>)
Qu'est ce que j'ai oublié ?
Merci,
Partager