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 :

Application Python et QT


Sujet :

PyQt Python

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut Application Python et QT
    Bonjour,

    Je viens de creer une interface sur QtDesigner puis avec la commande pyuc j'ai converti mon fichier frmInscription.ui, qui me donne frmInscription.py.
    Par rapport à une video que j'ai suivi, j'ai créé un autre fichier frmInscriptionDialog dans lequel je lance ma fenetre.

    Voici une partie de mon fichier frmInscription.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
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(265, 139)

    Voici mon fichier frmInscriptionDialog.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
     
    from PyQt4 import QtGui,QtCore
    from frmInscription import Ui_MainWindow
    import sys
     
     
    class MaFenetre(QtGui.QMainWindow,Ui_MainWindow):
        def __init__(self,parent=None):
            QtGui.QMainWindow.__init__(self, parent)
            self.setupUi(self)
     
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        fen = MaFenetre()
        fen.show()
        sys.exit(app.exec_())

    1- Que veut dire parent=None dans les parametres du constructeur __init__ ?
    2- Pourquoi je suis obliger de passer cette instruction QtGui.QMainWindow.__init__(self, parent) dans le constructeur ?
    3- Dans le main, je ne comprand pas l'importance de cette variable app = QtGui.QApplication(sys.argv)
    4- Je ne comprend pas non plus sys.exit(app.exec_())
    5- comment je peux faire un executable ?



    Merci de m'aider, je veux vraiment avancer avec PyQt.

  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,

    Qt4 n'étant plus supporté depuis cette année je te recommande d'utiliser Qt5.

    Tes questions:

    1- Que veut dire parent=None dans les parametres __init__ ?

    Lorsqu'un parent peut-être désigné à un widget, l'habitude syntaxique veux qu'on le mette dans les arguments à mot clef avec une valeur par défaut.
    Ce n'est pas quelque chose dont il faut se préocuper, certains disent que cela rend le code réutilisable. Peut-être bien.

    2- Pourquoi je suis obliger de passer cette instruction QtGui.QMainWindow.__init__(self, parent) dans le constructeur ?

    Malheureux ! __init__ n'est pas le constructeur, cette méthode spéciale sert simplement à initialiser l'instance de la clase (le constructeur s'appelle __new__()) et pour instancier la classe héritée, c-à-d la QMainWindow il faut l'instancier à son tour.
    Il y a trois façons de le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Foo(Baz):
        def __init__(self, arguments, parent=None):
            Baz.__init__(parent)
            # Equivalent:
            super(Baz, self).__init__(parent)
            # Equivalent python 3
            super().__init__(parent)
    la denière n'est garantie qu'avec Python 3.

    3- Dans le main, je ne comprand pas l'importance de cette variable app = QtGui.QApplication(sys.argv)

    Ce n'est important que pour les gens de chez Qt. Il faut créer une QApplication avant tout usage graphique.
    Un point c'est tout.

    4- Je ne comprend pas non plus sys.exit(app.exec_())

    sys.exit() fermera l'application Python sous réserve de l'exécution de app

    5- comment je peux faire un executable ?

    Ben ça m'a l'air exécutable, non ?

    Tu lances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    python3 frmInscriptionDialog.py
    et si c'est pas bon tu copies ici le traceback d'erreur complet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut
    Merci infiniment VinsS,
    je commence à comprendre.

    A- Je crois avoir lu dans un ouvrage que la methode def __init__(self) est le constructeur.

    B- Suivant ton exemple, la classe Foo herite de la classe Baz !! Donc il faut instancier la classe héritée (Baz). Mais pourquoi l'instancier puisqu'elle est passé en parametre dans la classe(Foo) ?

    C- J'ai installé PyQt-gpl-5.5.1(Voir image):
    C.1- j'ai utilisé son QtDesigner pour creer l'interface.
    C.2- apres la conversion du fichier .ui en .py, lorsque je regarde les codes du fichier. PyQT4 est toujours là dans l'entête de mon code python. A noté que, j'ai pas remarqué de fichier pyuic4 ou pyuic5 dans aucune des sous repertoire de PyQt-gpl-5.5.1. Comme j'utilise Anacounda, j'ai fait la conversion .ui en .py avec le fichier pyuic dans le sous repertoire Scripts dans Anacounda.

    Nom : dev.png
Affichages : 939
Taille : 43,6 Ko.

    Merci.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Petits compléments.

    Dans le "sys.exit(app.exec_())", le "app.exec_()" est important: c'est la boucle de traitement des évènements. Ça fait partie du principe de fonctionnement des programmes graphiques: une fois initialisé, le programme attend qu'on le sollicite (clavier, souris, etc...), et traite ces sollicitations (=évènements) au fur et à mesure. Il s'agit d'une différence très importante avec un programme traditionnel qui se déroule du début à la fin.

    Concernant PyQt5 sur Anaconda: à ma connaissance, les versions officielles d'Anaconda, même celle avec Python 3.5, viennent avec PyQt4 v4.11 (http://docs.continuum.io/anaconda/pkg-docs). Je ne sais pas s'il est possible d'installer PyQt5, mais si c'est possible, il faut voir comment (=> google). A mon avis, il ne suffit pas d'installer le exe de PyQt5.

    Concernant les programmes exécutables: en plus de l'exécution normale du code source Python avec l'interpréteur Python, on peut convertir ce code source en exécutable binaire (.exe sous Windows) avec des logiciels comme cx_freeze ou pyinstaller. Ce n'est pas toujours simple à faire, mais quand on y arrive, ça marche très bien. Ce n'est pas une vraie compilation comme en C: le code continue à être interprété en "bytes-codes" mais le programme est alors accompagné de l'interpréteur Python et de toutes les bibliothèques nécessaires (y compris celles de PyQt) afin de pouvoir être exécuté sur un PC qui n'a pas Python d'installé (ou qui n'a pas la bonne version). Mais je ne connais pas assez Anaconda pour savoir si c'est possible avec lui.

  5. #5
    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
    Une classe héritée n'est pas instanciée automatiquement, il faut le faire dans ton code.

    Sans cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> from PyQt5.QtWidgets import QApplication, QMainWindow
    >>> class MainWindow(QMainWindow):
    ...     def __init__(self):
    ...         self.resize(500, 400)
    ... 
    >>> app = QApplication([])
    >>> m = MainWindow()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in __init__
    RuntimeError: super-class __init__() of type MainWindow was never called
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> class MainWindow(QMainWindow):
    ...     def __init__(self):
    ...         super().__init__()
    ...         self.resize(500, 400)
    >>> app = QApplication([])
    >>> m = MainWindow()
    >>>
    Je ne peux pas te répondre pour Windows, sous Linux je n'ai qu'une seule instance du Designer et je choisis pyuic4 ou pyuic5 pour créer le fichier python selon mon besoin.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 720
    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 720
    Par défaut
    Salut,

    Citation Envoyé par calito Voir le message
    A- Je crois avoir lu dans un ouvrage que la methode def __init__(self) est le constructeur.

    B- Suivant ton exemple, la classe Foo herite de la classe Baz !! Donc il faut instancier la classe héritée (Baz). Mais pourquoi l'instancier puisqu'elle est passé en parametre dans la classe(Foo) ?
    Si vous déclarez une méthode (ici __init__) dans votre classe, vous surchargez les méthodes homonymes des classes parentes. Comme son nom l'indique __init__ sert à initialiser l'instance qui est en train d'être créée, en oubliant d'appeler les méthodes correspondantes des classes parentes, l'instance ne sera pas créée correctement.
    Une autre façon d'écrire votre code serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from PyQt4 import QtGui,QtCore
    from frmInscription import Ui_MainWindow
     
     
    class MaFenetre(QtGui.QMainWindow,Ui_MainWindow):
            pass
     
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        fen = MaFenetre()
        fen.setupUi(fen)
        fen.show()
        sys.exit(app.exec_())
    Dans ce cas, pas de surcharge de la méthode __init__ et vous n'avez plus à veiller à ce que l'initialisation se passe correctement puisque vous ne plantez plus un cailloux sur le chemin.

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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Une classe héritée n'est pas instanciée automatiquement, il faut le faire dans ton code.

    Sans cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> from PyQt5.QtWidgets import QApplication, QMainWindow
    >>> class MainWindow(QMainWindow):
    ...     def __init__(self):
    ...         self.resize(500, 400)
    ... 
    >>> app = QApplication([])
    >>> m = MainWindow()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in __init__
    RuntimeError: super-class __init__() of type MainWindow was never called
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> class MainWindow(QMainWindow):
    ...     def __init__(self):
    ...         super().__init__()
    ...         self.resize(500, 400)
    >>> app = QApplication([])
    >>> m = MainWindow()
    >>>

    Merci. Donc si je comprends bien
    lorsqu'une classe B hérite d'une autre classe A,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     class MaClasseA(MaClasseB):
    il faut instancier dans le __init__ MaClasseB !!
    Dans mon cas et suivant l'exemple que tu as donné, est-ce que je peux mettre à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtGui.QMainWindow.__init__(self, parent)
    ?

  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
    Oui, super().__init__() c'est parfait.

    Ici, nous sommes dans le cas de la QMainWindow, donc pas de parent, c'est pareil avec QObject, pour les autres cas tu mets le parent dans l'__init__() même si il est None.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut
    C'est bon,merci à vous tous.

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

Discussions similaires

  1. Installation application/python 2.6.6 problème lib
    Par ben.IT dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 30/05/2011, 10h13
  2. Distribution d'une application Python
    Par zelegolas2 dans le forum Général Python
    Réponses: 6
    Dernier message: 03/05/2011, 13h59
  3. Refaire une application Python sous Django
    Par Jiyuu dans le forum Django
    Réponses: 3
    Dernier message: 04/04/2009, 15h15
  4. repise d'une application python
    Par spinakur dans le forum Django
    Réponses: 3
    Dernier message: 24/12/2008, 09h32
  5. Internationnalisation d'une application Python
    Par leviathan516 dans le forum Général Python
    Réponses: 1
    Dernier message: 22/03/2006, 14h48

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