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

Python Discussion :

Signaux et slot


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Signaux et slot
    Bonjour, je travaille sur un Piface pour RaspBerry PI2

    Je teste l'appui sur les 4 boutons pressoirs

    J'ai 3 scripts

    main.py
    pifacetest.py
    card.py

    Dans main.py : je place un signal b1 (b2, b3, b4 ne sont pas activé pour simplifier)
    qui doit se connecter avec le slot de card.py

    le signal b1 est emit() lors de l'appui sur le bouton pressoir dans piface

    Tout fonctionne bien sauf que le Slot est ignoré (le message print'Plusieurs balles' est ignoré)

    Voici les 3 scripts , si une idée surgit, çà me ferait très plaisir

    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
    20
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from pifacetest import PiFaceControl
    import sys
     
    from PySide import QtGui
    from PySide.QtCore import *
    from card import Card
     
    def main():
    	app = QtGui.QApplication(sys.argv)
    	piface = PiFaceControl()
    	cr = Card()
     
    	piface.b1.connect(cr.someBalls)
     
    if __name__=='__main__':
    	main()
    pifacetest.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
    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    import pifacedigitalio
    from PySide import QtGui
    from PySide.QtGui import *
    from PySide.QtCore import *
     
    class PiFaceControl(QObject):
       b1 = Signal()
       b2 = Signal()
       b3 = Signal()
       b4 = Signal()
     
       def __init__(self):
     
            QObject.__init__(self)
            try:
                self.pifacedigital = pifacedigitalio.PiFaceDigital()
                self.listener = pifacedigitalio.InputEventListener(chip=self.pifacedigital)
    	    self.activateButtonListener()
            except ImportError:
                print 'The module pifacedigitalio is not installed'
     
       def button1Pressed(self,event):
            print'bouton 1'
    	self.b1.emit()
     
       def button2Pressed(self,event):
            self.b2.emit()
    	print'bouton 2'
     
       def button3Pressed(self,event):
            print'bouton 3'
    	self.b3.emit()
     
       def button4Pressed(self,event):
            print'bouton 4'
    	self.b4.emit()
     
       def activateButtonListener(self):
    	self.listener.register(0, pifacedigitalio.IODIR_FALLING_EDGE,self.button1Pressed)
    	self.listener.register(1, pifacedigitalio.IODIR_FALLING_EDGE,self.button2Pressed)
    	self.listener.register(2, pifacedigitalio.IODIR_FALLING_EDGE,self.button3Pressed)
    	self.listener.register(3, pifacedigitalio.IODIR_FALLING_EDGE,self.button4Pressed)
     
    	self.listener.activate()
    card.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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from PySide import QtGui
    from PySide.QtCore import *
     
    class Card:
    	def __init__(self):
    		#QObject.__init__(self)
    	        try:
    	        	print'je suis ds Card'
    	        except ImportError:
    	                print 'erreur ds Card'
     
            @Slot()
    	def someBalls(self):
    		        print'Plusieurs balles'

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Personne ?

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 760
    Par défaut
    Citation Envoyé par michelp3 Voir le message
    Personne ?
    Si les slots ne fonctionnaient pas çà se saurait. Donc pour essayer de vous aider, il créer 3 fichiers contenant vos codes (tout serait dans un fichier ne changerait pas le problème mais aiderait) et essayer de reproduire le problème. Comme pas grand monde utilise la bibliothèque "pifacetest", il faut modifier vos codes pour reproduire l'éventuel problème "sans".
    Enfin plus grand monde n'utilise PySide...
    L'un dans l'autre, çà réduit pas mal la population des volontaires...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Meilleurs vœux également

    J'ai regroupé les 3 programmes ds le main.py

    C'et exactement la meme chose

    Le problème , c'est que je dois initialiser Card ds le main et pas ds Pifacetest

    Je présente ici une version simplifiée d'un programme + complexe qui exige cette manière de faire

    On dirait donc que self.b1.emit() ds Pifacetest n'est pas entendu ds le main (piface.b1.connect(cr.someBalls())

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 760
    Par défaut
    Salut,

    Je ne vois pas la version "simplifiée" du programme.
    Avec Qt4, j'écrirai cette version "simplifiée" ainsi:
    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
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
     
    class C:
        @pyqtSlot()
        def on_click(self):
            print ('2-on click')
     
    class Window(QWidget):
        b1 = pyqtSignal()
     
        def __init__(self, parent = None):
            QWidget.__init__(self, parent)
     
            button = QPushButton("Click me")
            button.clicked.connect(self.on_click)
            layout = QVBoxLayout(self)
            layout.addWidget(button)
     
     
        def on_click(self):
            print('1-on_click')
            self.b1.emit()
     
    if __name__ == "__main__":
     
        app = QApplication([])
        window = Window()
        c = C()
        window.b1.connect(c.on_click)
        window.show()
        app.exec_()
    Et bien sur, çà fonctionne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut C'est pas grand chose ...et pourtant
    OK çà marche

    La solution : app.exec_() est manquant ds def main()

    Merci pour les réponses

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

Discussions similaires

  1. Signaux et slots comme Qt
    Par b Oo dans le forum Qt
    Réponses: 21
    Dernier message: 11/04/2007, 17h57
  2. [Qt4] Signaux et Slot
    Par gentox dans le forum Qt
    Réponses: 9
    Dernier message: 25/01/2007, 18h35
  3. Réponses: 10
    Dernier message: 09/10/2005, 22h33

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