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 :

Création de slots (PyQt4)


Sujet :

PyQt Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut Création de slots (PyQt4)
    Bonjour,

    j'ai rencontre un probleme lors de la creation de slots.

    En effet, souhaitant creer un slot lie a un bouton, j'ai bien ajoute un slot a ma MainWindow, mais lorsque j'ai tente de l'implementer (Formulaire -> Visualizer le code), j'ai obtenu l'erreur contenu dans l'image jointe.

    Pourtant j'ai bien un dossier uic ici: C:\Python26\Lib\site-packages\PyQt4\uic

    Si quelqu'un a une idee... merci a vous !!!


    note: je suis sous Windows XP, avec Python 2.6.2 et PyQT4.
    Images attachées Images attachées  

  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
    Bonjour, le message d'erreur dit 'Impossible de lancer', pourquoi lancer ? c'est un dossier.

    Qu'est-ce que tu appelle implémenter ? s'agit-il d'une gui dont le fichier a été produit en xml par QDesigner ?

    Tu peux nous montrer le code de la partie '(Formulaire -> Visualizer le code)', ça aidera à comprendre.

    vincent

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Oui j'implemente une interface graphique avec QT Designer.

    Du coup j'ai cree plusieurs boutons et ajoute des signaux/slots deja existants dans QT Designer ( exemple: signal = toggled(bool), et slot = setEnabled(bool) ).

    Mais lorsque je veux implementer un nouveau slot je ne peux pas. Comme tu viens de dire, je clique sur "Formulaire -> Visualizer le code", mais j'obtiens le message d'erreur (image) et je ne peux donc faire aucun code et visualiser aucun code !!

  4. #4
    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
    Bon, résumons, tu as créé une interface avec QDesigner, enregistrée, donc, en .ui.

    C'est de l'XML et tu aimerais consulter ce code pour ajouter de nouveaux slots et pour cela tu préfèrerais l'avoir en Python.

    Si je me trompe, tu m'arrête, je ne vois absolument pas ce que sont 'Formulaire > visualiser le code' c'est dans le menu de ton idle ?
    moi, j'utilise Eric et gedit, alors ...

    Bref, pour avoir ton .ui en .py, en console, tu te mets dans le bon dossier et tu entres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pyuic4 _x monapply.ui -o monapply.py
    explication : -x rajoutera quelques lignes de code à la fin du fichier pour le rendre exécutable et -o désigne le nom de fichier que tu désire en sortie.

    Pour les slots que tu as créés dans le QDesigner il faudra que tu t'assures de l'emplacement des fonctions appelées, Pyuic4 rajoutant un 'self' systématiquement devant le nom.

    vincent

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Ce n'est pas tout a fait ca VinsS. En fait la conversion XML > python (avec la commande pyuic4) fonctionne tres bien.

    Le probleme se situe dans l'ajout de nouveaux slots. Le truc c'est que j'aimerais les ajouter directement dans le .ui (donc via QDesigner, avant la conversion en python) et non dans le code python genere apres "pyuic4 -x ...".

    Et pour ce faire, il 'suffit' de cliquer sur 'Formulaire > Visualiser code' pour ouvrir l'editeur de texte ou je pourrais implementer mes nouveaux slots.

    Mais l'editeur de texte ne s'ouvre pas et j'obtiens la fenetre d'erreur que j'ai mise en piece jointe.

    Dis-moi si tu as compris ou si tu as encore des questions ??

  6. #6
    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
    OK, vu, je n'avais jamais utilisé ça.

    Mais, mais, ça y'en a pas bonne idée.

    Tout d'abord ce n'est pas un éditeur, c'est en lecture seule et pour cause, il ne serait pas normal que tu modifie le code de l'objet qui est actuellement ouvert dans le designer. C'est comme si deux applications différentes ouvraient un même fichier en édition en même temps.

    De plus c'est pas nécessairement lisible.

    Un exemple (parce que chez moi, ça marche!):

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    /********************************************************************************
    ** Form generated from reading ui file 'diaporamakn7080.ui'
    **
    ** Created: Mon Apr 26 14:25:07 2010
    **      by: Qt User Interface Compiler version 4.5.0
    **
    ** WARNING! All changes made in this file will be lost when recompiling ui file!
    ********************************************************************************/
     
    #ifndef DIAPORAMAKN7080_H
    #define DIAPORAMAKN7080_H
     
    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QDialog>
    #include <QtGui/QGraphicsView>
    #include <QtGui/QGridLayout>
    #include <QtGui/QHeaderView>
    #include <QtGui/QLabel>
     
    QT_BEGIN_NAMESPACE
     
    class Ui_Dialog
    {
    public:
        QGridLayout *gridLayout_2;
        QGridLayout *gridLayout;
        QGraphicsView *screen;
        QLabel *zoom_lbl;
        QLabel *name_lbl;
        QLabel *title_lbl;
        QLabel *info_1_lbl;
        QLabel *info_2_lbl;
     
        void setupUi(QDialog *Dialog)
        {
            if (Dialog->objectName().isEmpty())
                Dialog->setObjectName(QString::fromUtf8("Dialog"));
            Dialog->resize(750, 646);
            QIcon icon;
            icon.addPixmap(QPixmap(QString::fromUtf8("../ui/media/oqapy_ic_48.png")), QIcon::Normal, QIcon::Off);
            Dialog->setWindowIcon(icon);
            gridLayout_2 = new QGridLayout(Dialog);
            gridLayout_2->setSpacing(0);
            gridLayout_2->setMargin(0);
            gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
            gridLayout = new QGridLayout();
            gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
            screen = new QGraphicsView(Dialog);
            screen->setObjectName(QString::fromUtf8("screen"));
            screen->setFrameShape(QFrame::NoFrame);
            screen->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
            screen->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
            screen->setSceneRect(QRectF(0, 0, 300, 200));
            screen->setRenderHints(QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing);
     
            gridLayout->addWidget(screen, 0, 0, 1, 5);
     
            zoom_lbl = new QLabel(Dialog);
            zoom_lbl->setObjectName(QString::fromUtf8("zoom_lbl"));
     
            gridLayout->addWidget(zoom_lbl, 1, 0, 1, 1);
     
            name_lbl = new QLabel(Dialog);
            name_lbl->setObjectName(QString::fromUtf8("name_lbl"));
     
            gridLayout->addWidget(name_lbl, 1, 1, 1, 1);
     
            title_lbl = new QLabel(Dialog);
            title_lbl->setObjectName(QString::fromUtf8("title_lbl"));
     
            gridLayout->addWidget(title_lbl, 1, 2, 1, 1);
     
            info_1_lbl = new QLabel(Dialog);
            info_1_lbl->setObjectName(QString::fromUtf8("info_1_lbl"));
     
            gridLayout->addWidget(info_1_lbl, 1, 3, 1, 1);
     
            info_2_lbl = new QLabel(Dialog);
            info_2_lbl->setObjectName(QString::fromUtf8("info_2_lbl"));
    Non, franchement, fais tes connect dans ton .py tu en seras maître.

    Sauf si tu m'explique que ce n'est pas possible.

    Tu peux toujours ouvrir le .ui dans ton block note mais fais une copie d'abord.

    vincent

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    D'accord, ca me parait plus judicieux aussi, et tu viens de me convaincre

    Le seul probleme est que je ne sais pas du tout comment relier l'interface que j'ai faite a une classe python qui s'occuperait de recuperer les differentes valeurs de mes checkBox, lineEdit et autres champs de l'interface !!??

    Je vais de ce pas chercher quelques tutos, mais comme tu as l'air bien cale, si tu as quelques explications pour recuperer tout ca je suis tout ouie

  8. #8
    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
    Ca c'est pas très difficile, dans le fichier de ton interface, tu as trouvé ces lignes ci à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()        
        ui.setupUi(MainWindow)      
        MainWindow.show()           
        sys.exit(app.exec_())
    Dans ton programme principal, tu fais tes imports,
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from monInterface import*           # Ton fichier converti avec pyuic4
    from errorCopy import*              # p. ex. une boite de dialogue
    from tools import*                  # p. ex. un script plein d'utilitaires
     
    from PyQt4 import QtCore, QtGui
     
    etc
    Ensuite à la fin de ton programme principal tu copie intégralement les dernière lignes de celui de l'interface et tu modifie en conséquence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        erc = CopyError()            # Ca, python sait où le trouver grâce à l'import
        tool = Tools()                  # Pareil
        ui = Ui_MainWindow()       # Ton interface,
        ui.setupUi(MainWindow)    # il la lance
        mcs = MaClass()              # Tu instancie enfin ton apply (ce 
                                             #   fichier-ci)
        MainWindow.show()          # On affiche l'interface
        sys.exit(app.exec_())
    Maintenant dans ton apply, les widgets de l'interface sont utilisables avec ui.
    Exemple pour un connect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QtCore.QObject.connect(ui.monBouton, QtCore.SIGNAL
                                    ("clicked()"), self.maFonction)
    En supposant que maFonction fasse partie de cette classe, tu adapte.

    Voilà.

    vincent

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    C'est vraiment super clair VinsS. Je n'ai pas encore teste mais ça m'a l'air tres bien explique.

    Par contre il y a un truc que je n'ai pas compris en lisant, c'etait l'endroit ou tu implementes les signal/slot. Il faut les implementer dans le programme principal ? Faire une classe spéciale ?

    Mais du coup l'interface s'afficher après l'instanciation de la classe !? on peut quand même recuperer les valeurs des widgets par la suite ??

    J'ai plein de questions qui me viennent la mais bon faudrait que je teste avant pour que les choses soient plus claires

    En tout cas merci bien, je ne savais plus comment m'en sortir là !!

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Finalement je suis perdu...

    Ca m'avait l'air plutot simple (et puis ca doit l'etre lol) mais la je m'embrouille entre mes differentes classes et je n'y vois plus trop clair !!!

    D'un cote j'ai mon interface graphique:

    gui.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # -*- coding: utf-8 -*-
    # Form implementation generated from reading ui file 'gui.ui'
    # Created: Tue Apr 27 09:53:27 2010
    #      by: PyQt4 UI code generator 4.7.3
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
        ...

    et d'un autre cote j'ai mon fichier qui sert a gerer mes parameters:

    generation-sequences.py (nom en rapport avec mon projet):
    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 gui import *
    from PyQt4 import QtCore, QtGui
     
     
    class Params:
    	def __init__(self, name, format_video, format_image):
    		self.name = name
    		self.format_video = format_video
    		self.format_image = format_image
     
     
    class Apply:
    	def __init__(self):
    		QtCore.QObject.connect(self.button_generate, QtCore.SIGNAL("clicked()"), self.retrieveParams)
     
    	def retrieveParams():
    		print "ok"
     
     
    if __name__ == "__main__":
    	import sys
    	app = QtGui.QApplication(sys.argv)
    	MainWindow = QtGui.QMainWindow()
    	ui = Ui_MainWindow()
            ui.setupUi(MainWindow)
     
            mcs = Apply()
     
            MainWindow.show()
    	sys.exit(app.exec_())
    Du coup il y a des erreurs dans ma classe Apply, mais je ne vois pas comment recuperer les valeurs de mes widgets via cette classe...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Par défaut
    Finalement je ne suis plus perdu Comme quoi c'est pratique d'ecrire ses erreurs... ca nous permet de trouver la solution !!

    dans le signal/slot que j'implemente il ne fallait pas ecrire self.button_generate pour acceder a ce bouton mais ui.button_generate.

    ui etant une instance de mon interface

    J'espere ne plus avoir trop de soucis maintenant !!

    En tout cas merci bien VinsS pour tous ces conseils

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 12/11/2011, 22h55
  2. Réponses: 1
    Dernier message: 03/01/2011, 19h13
  3. [Kylix] Création d'un fichier lien
    Par DrQ dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2002, 21h30
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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