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 :

Émission et réception de signaux [QtCore]


Sujet :

PyQt Python

  1. #1
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut Émission et réception de signaux
    à tous,

    Je bute sur un problème à priori simple mais avec lequel je m'arrache les cheuveux : l'émission et la réception de signaux personnalisés avec PyQt5. Je sais que ce dernier point (PyQt5) risque d'en coincer quelques uns, mais sait-on jamais .

    L'idée est simple : j'ai 3 scripts Python. Le premier appel une fonction du deuxième qui émet un signal qui doit être capté par le troisième.

    script 1 (main.py) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from child1 import Child1
     
    Child1().connect_and_emit_signal()
    script 2 (child1.py) :
    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
    from PyQt5.QtCore import QObject, pyqtSignal
     
    class Child1(QObject):
        def __init__(self, parent=None):
            super(Child1, self).__init__(parent)
     
        signal = pyqtSignal()
        signal2 = pyqtSignal()
        signal3 = pyqtSignal()
     
        def connect_and_emit_signal(self):
            self.signal.connect(self.handle_signal)
            self.signal2.connect(Child1_1().handle_signal)
     
            self.signal.emit()
            self.signal2.emit()
            self.signal3.emit()
     
        def handle_signal(self):
            print ("signal received")
     
    class Child1_1(QObject):
        def handle_signal(self):
            print ("signal2 received")
    script 3 (child2.py) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from PyQt5.QtCore import QObject, pyqtSignal
     
    from child1 import Child1
     
    class Child2(QObject):
        def __init__(self, parent=None):
            super(Child2, self).__init__(parent)
     
            Child1().signal3.connect(self.handle_signal)
     
        def handle_signal(self):
            print ("signal3 received")
    Le code est très raccourci, et pour diverses raisons j'aimerai éviter d'avoir à supprimer l'import de child1 dans child2 au profit de l'inverse, ce qui simplifierai grandement les choses mais qui serait nettement moins drôle .

    Il me semble avoir déjà fait ça avec PyQt4, mais la syntaxe SLOT et SIGNAL a pas mal changé avec la version 5, du coup je bloque

    Une idée ?

    Merci à tous par avance.

    J
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  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
    Salut,

    Ben non, la syntaxe n'a pas changé, simplement les signal-slots old style ne sont plus supportés.

    Bref, tu ne dis pas où et quand Chid2() est instanciée, alors je propose une approche classique.
    main.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from child1 import Child1
    from child2 import Child2
     
    c = Child1()
    c2 = Child2()
    c.signal3.connect(c2.handle_signal)
    c.connect_and_emit_signal()
    child1.py
    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
     
    from PyQt5.QtCore import QObject, pyqtSignal
     
    class Child1(QObject):
        signal = pyqtSignal()
        signal2 = pyqtSignal()
        signal3 = pyqtSignal()
        def __init__(self, parent=None):
            super(Child1, self).__init__(parent)
     
        def connect_and_emit_signal(self):
            self.signal.connect(self.handle_signal)
            self.signal2.connect(Child1_1().handle_signal)
     
            self.signal.emit()
            self.signal2.emit()
            self.signal3.emit()
     
        def handle_signal(self):
            print ("signal received")
     
    class Child1_1(QObject):
        def handle_signal(self):
            print ("signal2 received")
    child2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from PyQt5.QtCore import QObject, pyqtSignal
     
    class Child2(QObject):
        def __init__(self, parent=None):
            super(Child2, self).__init__(parent)
     
        def handle_signal(self):
            print ("signal3 received")
    Testé et approuvé.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Salut VinsS et merci pour ton aide.

    J'ai testé et adapté à mon programme, mais malheureusement ça gaz pas. Concernant Child2 il est bien instancié au même niveau que Child1.

    J'ai refait un exemple plus proche de mon cas (j'ai pu simplifier en retirant Child2). Le voici :

    main.py
    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
    from PyQt5.QtCore import QObject, pyqtSignal
     
    from child1 import Child1
     
     
    class Main(QObject):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
     
        def handle_signal(self):
            print ("signal2 received")
     
     
    c1 = Child1()
    main = Main()
     
     
    c1.connect_and_emit_signal()
    c1.signal2.connect(main.handle_signal)
    child1.py
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from PyQt5.QtCore import QObject, pyqtSignal
     
    class Child1(QObject):
        def __init__(self, parent=None):
            super(Child1, self).__init__(parent)
     
        signal = pyqtSignal()
        signal2 = pyqtSignal()
     
        def connect_and_emit_signal(self):
            self.signal.connect(self.handle_signal)
     
            self.signal.emit()
            self.signal2.emit()
     
        def handle_signal(self):
            print ("signal received")

    EDIT : Bon en fait dans l'exemple ci-dessus de main.py si je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c1.connect_and_emit_signal()
    c1.signal2.connect(main.handle_signal)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c1.signal2.connect(main.handle_signal)
    c1.connect_and_emit_signal()
    ça fonctionnera un peu mieux... en tout cas dans l'exemple... me reste plus qu'à trouver pourquoi pas dans mon programme
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

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

Discussions similaires

  1. Socket: Tailles des buffers en émission et réception
    Par rulianf dans le forum Réseau
    Réponses: 0
    Dernier message: 17/02/2010, 16h01
  2. Chaine d'émission et de réception du système WCDMA
    Par torrent208 dans le forum Simulink
    Réponses: 4
    Dernier message: 05/06/2009, 23h13
  3. Réponses: 5
    Dernier message: 01/04/2009, 02h06
  4. émission et réception dans le même projet
    Par jleil dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 05/06/2008, 22h15
  5. Réponses: 5
    Dernier message: 21/11/2007, 15h11

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