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 :

Signal et Slot


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 39
    Points
    39
    Par défaut Signal et Slot
    Bonjour a vous tous,

    J'aimerais avoir votre aide. Je viens de creer mon premier plugin, j'ai dessiner l'interface avec Qt Designer4. Je voulais cahnger le texte "papa" en "maman" en faisant un click sur le bouton valider. Malheureusement ca'n marche pas.

    Voici mon 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
     
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s
     
    class Ui_test(object):
        def setupUi(self, test):
            test.setObjectName(_fromUtf8("test"))
            test.resize(333, 221)
            self.label_3 = QtGui.QLabel(test)
            self.label_3.setGeometry(QtCore.QRect(130, 60, 121, 17))
            self.label_3.setObjectName(_fromUtf8("label_3"))
            self.pushButton = QtGui.QPushButton(test)
            self.pushButton.setGeometry(QtCore.QRect(100, 100, 98, 41))
            self.pushButton.setObjectName(_fromUtf8("pushButton"))
     
            self.retranslateUi(test)
            QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()", self.Changer()))
            QtCore.QMetaObject.connectSlotsByName(test)
     
        def retranslateUi(self, test):
            test.setWindowTitle(QtGui.QApplication.translate("test", "test", None, QtGui.QApplication.UnicodeUTF8))
            self.label_3.setText(QtGui.QApplication.translate("test", "Papa", None, QtGui.QApplication.UnicodeUTF8))
            self.pushButton.setText(QtGui.QApplication.translate("test", "Okey", None, QtGui.QApplication.UnicodeUTF8))
     
        def Changer(self):
            self.label_3.setText(QtGui.QApplication.translate("test", "Maman", None, QtGui.QApplication.UnicodeUTF8))

    Merci deja pour votre aide. Bye.

  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,

    Une description de ce qui ne va pas aurait aidé.

    Tout d'abord rajoute ceci à la fin de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_test()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    en n'oubliant pas d'importer sys

    Ensuite ton signal est mal formaté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()", self.Changer()))
    il manque une parenthèse fermante après "clicked()" et il ne faut pas en mettre à self.Changer.

    Il est de toutes façons préférable d'utiliser la nouvelle syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.pushButton.clicked.connect(self.Changer)

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    +1 pour VinsS

    Par la suite, il n'est pas raisonnable de travailler directement avec le code Python issu de QtDesigner + pyuic4, parce que chaque modif ultérieure par QtDesigner effacera impitoyablement tes ajouts...

    Il faut donc adopter une autre méthode de développement, et voici la mienne:

    Dans le même répertoire, je mets (tu remplaces "fichier" par ce que tu veux):

    - fichier_ui.ui => le fichier créé par QtDesigner (=fichier XML)
    - fichier_ui.bat => le script pour transformer fichier_ui.ui en fichier_ui.py avec pyuic4, et qui contient sous Windows (on fait pareil sous Linux):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pyuic4 fichier_ui.ui -o fichier_ui.py
    - fichier_ui.py => le fichier python créé par pyuic4
    - fichier.py => le fichier portant le programme principal (celui qu'il faut lancer)

    Pour le fichier à lancer (fichier.py), il faut gérer quelques modèles de base, qui permettent de ne pas repartir d'une page blanche à chaque fois. Voilà un exemple pour aller avec ton 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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    from fichier_ui import Ui_test # ligne d'importation à adapter
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.ui = Ui_test()
            self.ui.setupUi(self)
     
            self.setWindowTitle(u"Modèle de fenêtre PyQt4") # titre de la fenêtre
            #self.setWindowIcon(QtGui.QIcon('iconefenetre.ico')) # icone de la fenêtre
            #self.resize(400, 300) # redimensionne la fenetre
     
    #############################################################################
    if __name__ == '__main__':
     
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Il te suffira d'adapter la ligne d'importation du fichier_ui pour faire apparaitre ta fenêtre. Tu ajoutes ensuite tout ce qui est nécessaire à ton programme et qui n'a pas été mis par QtDesigner. Par exemple, tu peux accéder au bouton à partir du programme principal par: "self.ui.pushButton".

    A chaque modification/enregistrement de la fenêtre par QtDesigner, tu exécutes le fichier bat (double-clic dans Windows Explorer), et tu peux lancer le fichier principal fichier.py pour exécuter l'ensemble: c'est très rapide pour les mises au point!

    Bons développements!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Bonjour VinnS,

    Je n'ai rien ajouter comme code, j'ai tout simplement apporter une petite modification dans la facon dont j'ai defini le signal :

    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()", self.Changer()))
    J'ai effacer les parenthese :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.Changer)

    Merci infiniement pour ton support, merci encore.
    A bientot

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

Discussions similaires

  1. probleme de code Qt: signal and Slot
    Par vivh349 dans le forum Qt
    Réponses: 10
    Dernier message: 08/07/2009, 12h17
  2. Signals et Slots avec QextSerialPort
    Par sardik dans le forum Qt
    Réponses: 1
    Dernier message: 05/05/2009, 17h30
  3. SIGNAL et SLOT (gros debutant)
    Par mesobius dans le forum Débuter
    Réponses: 4
    Dernier message: 19/01/2009, 11h18
  4. connect Signal et slot perso
    Par freecircus dans le forum Qt
    Réponses: 3
    Dernier message: 13/12/2006, 20h25

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