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 :

PyQt5 et thread


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Par défaut PyQt5 et thread
    Bonsoir, j'ai une interface PyQt5 avec un afficheur lcd. J'arrive à modifier sa valeur à partir d'un thread. Je souhaiterai créer un autre thread pour récupérer cette valeur depuis l'interface graphique. Pour d'autres widgets, ce sera , je pense le même principe. Merci d'avance. Voici le code:

    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
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    import os,sys
     
     
    # --- importation du fichier de description GUI ---
    from ui_testLcd import *
     
    # classe principale contenant le code actif
     
    class myApp(QWidget, Ui_Form1): # la classe reçoit le Qwidget principal
    # Note : ici self représente la classe
        def __init__(self, parent=None):
            QWidget.__init__(self) # initialise le Qwidget principal
            self.setupUi(parent) # Obligatoire
            self.Thread = ThreadAfficher(self)
            self.Thread.jobDone.connect(self.afficherDonnee)
            self.Thread.start()
     
     
        def afficherDonnee(self,regime):
                """Affichage de la valeur regime dans le l'afficheur"""
                self.lcdNumbe1r.display(regime)
     
    class ThreadAfficher(QtCore.QThread):
            """objet thread gérant l'envoi de la valeur regime"""
            jobDone = pyqtSignal(int)
            def __init__(self,parent=None):
                    super(ThreadAfficher,self).__init__(parent)
     
            def run(self):
                    while 1:
                        self.jobDone.emit(3200) #envoi d'une valeur à afficher
     
     
     
    # fonction principale exécutant l'application Qt
    def main(args):
        a=QApplication(args) # crée l'objet application
        f=QWidget() # crée le QWidget racine
        c=myApp(f) # appelle la classe contenant le code de l'application
        f.show() # affiche la fenêtre QWidget
        r=a.exec_() # lance l'exécution de l'application
        return r
     
     
    # pour rendre le fichier *.py exécutable
    if __name__=="__main__": # pour rendre le code exécutable
        main(sys.argv) # appelle la fonction main

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Et bien voila, tu as trouvé la balise code, et en plus tu as simplifié ton code.

    Maintenant tu ne nous dis pas ce qui t'empêche d'y ajouter le second thread, tu l'avais fait dans la première version.

    Une remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            def run(self):
                    while 1:
                        self.jobDone.emit(3200)
    Je suppose que ton thread est censé faire autre chose que cela. et que tu as prévu un moyen de sortir de la boucle while. Sinon faudra y penser.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Par défaut PyQt Thread
    Bonjour, merci pour votre réponse. Le 2ème Thread est un souci car maintenant je souhaite récupérer la valeur affichée par le lcd (ici 3200). En fait au final, je lirai toutes les 10 secondes cette valeur. Donc j'ai vu la méthode lcdNumber.value() qui permet de le faire . La différence avec le 1er Thread, c'est que je dois recevoir la valeur et non l'envoyer à un slot (self.lcdNumbe1r.display). J'ai longuement cherché en vain. Merci .

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Par défaut PyQt et thread
    J'ai ben essayé ceci mais ça me paraît trop simple et il y a une 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
    class myApp(QWidget, Ui_Form1): # la classe reçoit le Qwidget principal
    # Note : ici self représente la classe
        def __init__(self, parent=None):
            QWidget.__init__(self) # initialise le Qwidget principal
            self.setupUi(parent) # Obligatoire
            self.Thread = ThreadAfficher(self)
            self.Thread.jobDone.connect(self.lcdNumbe1r.display)
            self.Thread.start()
            self.Thread2 = ThreadRecup(self)
            self.Thread2.start()
     
        def recup(self):
            return self.lcdNumbe1r.value()
     
     
    class ThreadAfficher(QtCore.QThread):
            """objet thread """
            jobDone = pyqtSignal(int)
            def __init__(self,parent=None):
                    super(ThreadAfficher,self).__init__(parent)
     
            def run(self):
                    while 1:
                        self.jobDone.emit(3200) #envoi d'une valeur à afficher
     
     
    class ThreadRecup(QtCore.QThread):
            """objet thread """
     
            def __init__(self,parent=None):
                    super(ThreadRecup,self).__init__(parent)
     
            def run(self):
                    val=myApp.recup(self)
                    print(val)

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                    val=myApp.recup(self)
    Pourquoi met-tu self en argument ? Il n'y a aucune raison.

    Si tu as une erreur, il faut copier ici le traceback complet qu'on puisse comprendre.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 12
    Par défaut PyQt et thread
    Voici le traceback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "C:\Python33\ui_testLcdMain.py", line 48, in run
        val=myApp.recup(self)
      File "C:\Python33\ui_testLcdMain.py", line 26, in recup
        return self.lcdNumber1r.value()
    AttributeError: 'ThreadRecup' object has no attribute 'lcdNumber1r'
    Je sais, c pas très normal de mettre self, mais si je ne mets rien, je ne mets rien non plus dans ma méthode recup() et ce n'est pas logique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  3. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  4. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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