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

GUI Python Discussion :

PyQt 5 Problème avec slot personnalisé


Sujet :

GUI Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut PyQt 5 Problème avec slot personnalisé
    Bonjour à tous,

    Voilà je viens de découvrir python et maintenant PyQt.

    Je suis sous Python 3.4 avec la bibli PyQt5.

    J'essaye de concevoir une mini fenêtre pour mon script qui comporterait dans un premier temps 3 boutons.
    Ce script fonctionne comme un planificateur de tâche (Il est très basique pour le moment) et permet donc de lancer une tâche toutes les X minutes.
    Ma fenêtre comporte un bouton (bouton 2 états) par tâche et quand celui-ci est "pressed" il doit changer la variable "statut_task" en True.

    J'ai pourtant regardé tous les tutos possible et celui avec lequel je travaille en se moment est celui-ci:
    http://web.univ-pau.fr/~puiseux/ense...Qt-zero.4.html

    même quand je copie/colle les 2 fichiers de test qu'il fournis (Main.py & maFenetre2.py) j'obtiens un message d'erreur.
    Voici le message d'erreur avec les 2 fichiers fournis:

    maFenetre2.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/python
    #-*-coding: utf-8 -*-
     
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys
     
     
    class MaFenetre(QWidget):
        def __init__(self):
            QWidget.__init__(self)
            self.setFixedSize(200, 100)
            self.slider = QSlider(Qt.Horizontal, self)
            self.slider.setRange(200, 600)
            self.slider.setGeometry(10, 40, 150, 20)
            self.connect(self.slider, SIGNAL("valueChanged(int)"), self.changerLargeur)
     
        def changerLargeur(self,largeur):
            self.setFixedSize(largeur,100)
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/python
    #-*-coding: utf-8 -*-
    
    from PyQt5 import QtCore
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys, maFenetre2
    
    
        def main(args):
        a=QApplication(args)
        fenetre=maFenetre2.MaFenetre()
        fenetre.show()
        r=a.exec_()
        return r
    
    
    if __name__=="__main__":
        main(sys.argv)
    
    
    Traceback (most recent call last):
      File "C:\Python34[/B]\Lib\site-packages\TestMain.py", line 21, in <module>
        main(sys.argv)
      File "C:\Python34\Lib\site-packages\TestMain.py", line 14, in main
        fenetre=maFenetre2.MaFenetre()
      File "C:\Python34\Lib\site-packages\maFenetre2.py", line 17, in __init__
        self.connect(self.slider, SIGNAL("valueChanged(int)"), self.changerLargeur)
    AttributeError: 'MaFenetre' object has no attribute 'connect'



    Maintenant mes fichiers,

    maFenetre.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
    #!/usr/bin/python
    #-*-coding: utf-8 -*-
     
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys
     
     
    class MaFenetre(QWidget):
         def __init__(self, FL=220, FH=100):
            QWidget.__init__(self)
            self.setWindowIcon(QIcon("icone.ico"))
            self.setWindowTitle("Application")
            self.setFixedSize(FL, FH)
            bouton1 = QPushButton("Task_1"self)
            bouton1.setCheckable(True)
            bouton2 = QPushButton("Task_2", self)
            bouton2.setCheckable(True)
            bouton3 = QPushButton("Task_3", self)
            bouton3.setCheckable(True)
     
            self.connect(bouton1, SIGNAL("pressed()"), self.statut_task)
     
            self.monLayout = QGridLayout()
            self.monLayout.addWidget(bouton1,0,0,1,1)
            self.monLayout.addWidget(bouton2,1,0,1,1)
            self.monLayout.addWidget(bouton3,2,0,1,1)
            self.setLayout(self.monLayout)
     
         def statut_task(self):
            statut_saver=True

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/python
    #-*-coding: utf-8 -*-
    
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys, maFenetre
    
    statut_saver=False
    
    def main(args):
        a=QApplication(args)
        fenetre=maFenetre.MaFenetre()
        fenetre.show()
        r=a.exec_()
        return r
    
    
    if __name__=="__main__":
        main(sys.argv)
    
    Traceback (most recent call last):
      File "C:\Python34\Lib\site-packages\Main.py", line 21, in <module>
        main(sys.argv)
      File "C:\Python34\Lib\site-packages\Main.py", line 14, in main
        fenetre=maFenetre.MaFenetre()
      File "C:\Python34\Lib\site-packages\maFenetre.py", line 25, in __init__
        self.connect(bouton2, SIGNAL("pressed()"), self.statut_task)
    AttributeError: 'MaFenetre' object has no attribute 'connect'

    Voilà je sais que c'est surement une connerie comme d'habitude mais je sature ..

    Si quelqu'un à le courage de me lire, merci d'avance !

    Bien à vous
    Gauthier

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ça c'est du "Old style" qui fonctionne encore avec PyQt4 mais plus avec PyQt5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.connect(bouton1, SIGNAL("pressed()"), self.statut_task)
    Seule syntaxe admise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.bouton1.pressed.connect(self.statut_task)
    Il y en a un autre qui traine dans maFenetre2.py

    Le tuto que tu suis est pour PyQt4.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Résolu après avoir bidouillé..

    J'avoue que je ne comprends pas encore bien tout, pourquoi met-on des self devant certaines commandes et pas d'autres ?

    Par exemple dans ma logique j'aurai mis des self devant tous les boutons aussi comme ceci :

    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
    #!/usr/bin/python
    #-*-coding: utf-8 -*-
     
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys
     
    time_duree_saver=120
    statut_saver = False
     
     
     
    class MaFenetre(QWidget):
         def __init__(self, FL=220, FH=100):
            QWidget.__init__(self)
            self.setWindowIcon(QIcon("icone.ico"))
            self.setWindowTitle("Application")
            self.setFixedSize(FL, FH)
            self.bouton1 = QPushButton("Task_1 ({0} sec)".format(time_duree_saver), self)
            self.bouton1.setCheckable(True)
            self.bouton2 = QPushButton("Task_2", self)
            self.bouton2.setCheckable(True)
            self.bouton3 = QPushButton("Task_3", self)
            self.bouton3.setCheckable(True)
            self.bouton1.clicked.connect(self.statut_saver_on)
     
            self.monLayout = QGridLayout()
            self.monLayout.addWidget(bouton1,0,0,1,1)
            self.monLayout.addWidget(bouton2,1,0,1,1)
            self.monLayout.addWidget(bouton3,2,0,1,1)
            self.setLayout(self.monLayout)
     
         def statut_saver_on(self):
     
            global statut_saver
            statut_saver = True
     
     
    def main(args):
        a=QApplication(args)
        fenetre=MaFenetre()
        fenetre.show()
        r=a.exec_()
        return r
     
     
    if __name__=="__main__":
        main(sys.argv)

    Mais voici le résultat..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "C:\Python34\Lib\site-packages\TestMain.py", line 49, in <module>
        main(sys.argv)
      File "C:\Python34\Lib\site-packages\TestMain.py", line 42, in main
        fenetre=MaFenetre()
      File "C:\Python34\Lib\site-packages\TestMain.py", line 29, in __init__
        self.monLayout.addWidget(bouton1,0,0,1,1)
    NameError: name 'bouton1' is not defined

    Et voici le code qui fonctionne..

    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
    #!/usr/bin/python
    #-*-coding: utf-8 -*-
     
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import os, sys
     
    time_duree_saver=120
    statut_saver = False
     
     
     
    class MaFenetre(QWidget):
         def __init__(self, FL=220, FH=100):
            QWidget.__init__(self)
            self.setWindowIcon(QIcon("icone.ico"))
            self.setWindowTitle("Application")
            self.setFixedSize(FL, FH)
            bouton1 = QPushButton("Task_1 ({0} sec)".format(time_duree_saver), self)
            bouton1.setCheckable(True)
            bouton2 = QPushButton("Task_2", self)
            bouton2.setCheckable(True)
            bouton3 = QPushButton("Task_3", self)
            bouton3.setCheckable(True)
            bouton1.clicked.connect(self.statut_saver_on)
     
            self.monLayout = QGridLayout()
            self.monLayout.addWidget(bouton1,0,0,1,1)
            self.monLayout.addWidget(bouton2,1,0,1,1)
            self.monLayout.addWidget(bouton3,2,0,1,1)
            self.setLayout(self.monLayout)
     
         def statut_saver_on(self):
     
            global statut_saver
            statut_saver = True
     
     
    def main(args):
        a=QApplication(args)
        fenetre=MaFenetre()
        fenetre.show()
        r=a.exec_()
        return r
     
     
    if __name__=="__main__":
        main(sys.argv)

    J'avais également un problème de variable locale, avec "global" j'ai résolu ce problème également..

    Voilà on sait jamais qu'un jour quelqu'un se servira de mon post pour économiser quelques cheveux ^^

    Bonne soirée à tous !
    Gauthier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Ça c'est du "Old style" qui fonctionne encore avec PyQt4 mais plus avec PyQt5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.connect(bouton1, SIGNAL("pressed()"), self.statut_task)
    Seule syntaxe admise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.bouton1.pressed.connect(self.statut_task)
    Il y en a un autre qui traine dans maFenetre2.py

    Le tuto que tu suis est pour PyQt4.


    Merci VinsS encore une fois c'est toi le plus rapide

    Je vois que tu aurais également mis le self.bouton1.pressed.(...)

    Tu aurais un tuto pour PyQt5 par hasard ?

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Il est assez logique que si le bouton est attribut de la classe alors il doit le rester.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            self.bouton1 = QPushButton("Task_1 ({0} sec)".format(time_duree_saver), self)
            # donc ...
            self.monLayout.addWidget(self.bouton1,0,0,1,1)
    Citation Envoyé par gaut5 Voir le message
    Tu aurais un tuto pour PyQt5 par hasard ?
    Pas à ma connaissance, faut utiliser ce qui existe pour PyQt4 et adapter.

    Cela dit, lorsque tu tombes sur un exemple PyQt4 tu peux toujours le passer à la moulinette décrite ici:
    http://www.developpez.net/forums/d13...yqt-5-douleur/

  6. #6
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Ahhh c'est bon ça merci beaucoup !!

    Cependant j'ai un autre petit problème, je pensais que mon bouton 2 états fonctionnerait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            bouton1.pressed.connect(self.action_1)
            bouton2.pressed.connect(self.action_2)
            bouton3.pressed.connect(self.action_3)
            bouton1.released.connect(self.action_4)
            bouton2.released.connect(self.action_5)
            bouton3.released.connect(self.action_6)
    mais ça ne fonctionne pas, quand je reclique sur le bouton, le released semble ne pas faire effet..
    Et je ne trouve rien de concluant pour PyQt 4 non plus :/

    Merci encore pour ton temps.

    Gauthier

  7. #7
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Pour les boutons deux états c'est le signal toggled qu'il faut utiliser.

    Le signal est transmit avec l'état en argument. 1 = checked, 0 = unchecked

  8. #8
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup encore une fois tu es le best !

    Gauthier

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

Discussions similaires

  1. Problème avec curseur personnalisé.
    Par Stevens.Georges dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2014, 18h33
  2. problème avec validator personnalisé
    Par Saif_24 dans le forum JSF
    Réponses: 1
    Dernier message: 11/03/2010, 23h37
  3. Réponses: 3
    Dernier message: 14/01/2008, 18h35
  4. Réponses: 11
    Dernier message: 10/12/2007, 09h46
  5. Problème de slot avec un QLabel
    Par Zec Merquise dans le forum Qt
    Réponses: 8
    Dernier message: 15/12/2006, 13h23

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