Bonjour,
je cherche à utiliser les thread dans le but de ne pas figer l'interface lorsqu'une opération lourde est demandée (par exemple un traçage de 1000000 de points sur matplotlib) ou pour laisser la main à l'utilisateur lorsque l'interface ouvre outlook pour proposer un envoie de message.
en parcourant la doc, j'ai compris qu'il y a deux moyens de gérer les thread: soit utiliser QThread (issu de PyQt5) soit utiliser threading (issu de python lui même).
du coup j'ai deux interrogations:
1- lequel choisir de préférence et pourquoi?
2- dans les deux codes ci dessous, les deux marchent... mais sont ils correctement "écrit"?
cas utilisant le threading python:
cas utilisant QThread de PyQt5:Code:
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 from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar) from matplotlib.figure import Figure from matplotlib.pyplot import * from scipy import stats from pathlib import Path from PyQt5.QtCore import * from datetime import date import csv import time import threading from mise_en_forme_user_interface import * from creation_widgets import * import pandas as pd import numpy as np import sys, os def update(self): print("mon premier thread") time_values= [i for i in range(1000000)] voltage_values=np.random.randn(1000000) self.graphique.plot(time_values, voltage_values, label="e") self.graphique.set_xlabel("Temps (s)", fontsize = 14) self.graphique.set_ylabel("Tension (V)", fontsize = 14) self.graphique.set_title("Mesures Brutes", fontsize = 14) self.canvas.draw() class Fenetre_Principale(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.fenetre_widget = QWidget() self.liste_x=["1","2","3"] self.liste_y=["a","b","c"] #Boutons self.bouton_charger_data = Bouton_simple(self, longueur=None, hauteur=None, texte="Charger Data") self.tracer_data = Bouton_simple(self, longueur=None, hauteur=None, texte="Tracer Data") #Labels (self, texte, style, nomDeLObjet, longueur, hauteur, icone, icone_name, back_color, ui): self.label_x = creation_Label(texte="Axe x:", taille_texte=12, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, border_color="rgb(87,117,131)", border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.label_y = creation_Label(texte="Axe y:", taille_texte=12, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, icone=False, border_color=None, border_radius=None, icone_name=None, back_color="transparent", ui=self) self.label_separateur = creation_Label(texte="Séparateur:", taille_texte=14, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, border_color=None, border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.label_decimal = creation_Label(texte="Decimale:", taille_texte=14, couleur_texte="black", alignement=None, style="normal",locked=False, longueur=None, hauteur=None,border_color=None, border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.edit_separateur = creation_ligne_texte(self, texte=None, taille_texte=16, coul_texte="rgb(87,117,131)", style_texte="normal", nom=None, longueur=None, hauteur=None, read_only=False) self.edit_decimal = creation_ligne_texte(self, texte=None, taille_texte=16, coul_texte="rgb(87,117,131)", style_texte="normal", nom=None, longueur=None, hauteur=None, read_only=False) #Combobox self.combobox_axe_x=creation_combobox(self, self.liste_x, taille_police=None, background_color=None, longueur=None, hauteur=None) self.combobox_axe_y=creation_combobox(self, self.liste_y, taille_police=None, background_color=None, longueur=None, hauteur=None) self.combobox_axe_x.setCurrentIndex(-1) self.combobox_axe_y.setCurrentIndex(-1) self.table_donnees=creation_table_b(self, 4, 4) self.graphique=QWidget() self.graph=QWidget() self.canvas=FigureCanvas(Figure()) self.graphique=self.canvas.figure.subplots(nrows=1, ncols=1) self.toolbar=NavigationToolbar(self.canvas, self) #Layout self.layout=construction_fenetre(self) self.tracer_data.clicked.connect(self.tracer) self.showMaximized() def tracer(self): x=threading.Thread(target=update(self)) x.start() def main(args): appli=QApplication(args) fenetre=Fenetre_Principale() fenetre.show() r=appli.exec_() return r if __name__=="__main__": main(sys.argv)
merci :-)Code:
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 from PyQt5.QtWidgets import QComboBox, QProgressBar, QFileDialog, QTabWidget, QTextEdit, QMessageBox, QGroupBox, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout, QApplication, QGraphicsScene, QGraphicsView, QCheckBox from matplotlib.backends.backend_qt5agg import (FigureCanvas, NavigationToolbar2QT as NavigationToolbar) from matplotlib.figure import Figure from matplotlib.pyplot import * from scipy import stats from pathlib import Path from PyQt5.QtCore import * from datetime import date import csv import time import threading from mise_en_forme_user_interface import * from creation_widgets import * import pandas as pd import numpy as np import sys, os class test(QThread): signal = pyqtSignal('PyQt_PyObject') def __init__(self, ui): QThread.__init__(self) self.ui=ui def run(self): time_values= [i for i in range(1000000)] voltage_values=np.random.randn(1000000) self.ui.graphique.plot(time_values, voltage_values, label="e") self.ui.graphique.set_xlabel("Temps (s)", fontsize = 14) self.ui.graphique.set_ylabel("Tension (V)", fontsize = 14) self.ui.graphique.set_title("Mesures Brutes", fontsize = 14) self.ui.canvas.draw() class Fenetre_Principale(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.fenetre_widget = QWidget() self.liste_x=["","",""] self.liste_y=["","",""] #Boutons self.bouton_charger_data = Bouton_simple(self, longueur=None, hauteur=None, texte="Charger Data") self.tracer_data = Bouton_simple(self, longueur=None, hauteur=None, texte="Tracer Data") #Labels (self, texte, style, nomDeLObjet, longueur, hauteur, icone, icone_name, back_color, ui): self.label_x = creation_Label(texte="Axe x:", taille_texte=12, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, border_color="rgb(87,117,131)", border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.label_y = creation_Label(texte="Axe y:", taille_texte=12, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, icone=False, border_color=None, border_radius=None, icone_name=None, back_color="transparent", ui=self) self.label_separateur = creation_Label(texte="Séparateur:", taille_texte=14, couleur_texte="black", alignement=None, style="normal", locked=False, longueur=None, hauteur=None, border_color=None, border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.label_decimal = creation_Label(texte="Decimale:", taille_texte=14, couleur_texte="black", alignement=None, style="normal",locked=False, longueur=None, hauteur=None,border_color=None, border_radius=None, icone=False, icone_name=None, back_color="transparent", ui=self) self.edit_separateur = creation_ligne_texte(self, texte=None, taille_texte=16, coul_texte="rgb(87,117,131)", style_texte="normal", nom=None, longueur=None, hauteur=None, read_only=False) self.edit_decimal = creation_ligne_texte(self, texte=None, taille_texte=16, coul_texte="rgb(87,117,131)", style_texte="normal", nom=None, longueur=None, hauteur=None, read_only=False) #self.edit_service = creation_ligne_texte(self,texte=None, taille_texte=16, coul_texte="rgb(87,117,131)", style_texte="normal", nom=None, longueur=150, hauteur=30, read_only=False) #Combobox self.combobox_axe_x=creation_combobox(self, self.liste_x, taille_police=None, background_color=None, longueur=None, hauteur=None) self.combobox_axe_y=creation_combobox(self, self.liste_y, taille_police=None, background_color=None, longueur=None, hauteur=None) self.combobox_axe_x.setCurrentIndex(-1) self.combobox_axe_y.setCurrentIndex(-1) self.table_donnees=creation_table_b(self, 4, 4) self.graphique=QWidget() self.graph=QWidget() self.canvas=FigureCanvas(Figure()) self.graphique=self.canvas.figure.subplots(nrows=1, ncols=1) self.toolbar=NavigationToolbar(self.canvas, self) #Layout self.layout=construction_fenetre(self) #Connect_fonctions_Boutons self.mon_premier_thread=test(self) self.tracer_data.clicked.connect(self.tracer) self.showMaximized() def tracer(self): self.mon_premier_thread.start() def main(args): appli=QApplication(args) fenetre=Fenetre_Principale() fenetre.show() r=appli.exec_() return r if __name__=="__main__": main(sys.argv)