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:

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
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)
cas utilisant QThread de PyQt5:

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
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)
merci :-)