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 :

Appeler une deuxième fenêtre


Sujet :

PyQt Python

  1. #1
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Par défaut Appeler une deuxième fenêtre
    bonjour,

    voila je veux appeler une deuxième fenêtre dans mon programme comme montrer sur se tuto http://pyqt.developpez.com/tutoriels...uperer-valeur/ mais le problème python bloque sur mon interface graphique (elle na pas été modifier). j'ai cherche un peu partout mais pas grand chose sur l'erreur que me donne python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception "unhandled AttributeError"
     'NoneType' object has no attribute 'setObjectName'
    j'ai trouver dans le principe que c'est une fonction qui ne s'attendait pas à ce type de réponse, mais je ne sais pas quoi modifier et ou se situ le problème ...
    (merci de me préciser si vous avé besoin d'une parti du code que se soit du principale OU l'interface)

    merci.

  2. #2
    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,

    Voilà la conversion du code du tuto en Python 3 et PyQt5 (avec quelques améliorations):

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3, PyQt5
     
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    #############################################################################
    class Quelclient(QtWidgets.QWidget):
     
        # crée un signal pour envoyer une chaine à la fermeture de la fenêtre
        fermeturequelclient = QtCore.pyqtSignal(str)
     
        def __init__(self, parent=None):
            """initialise la fenêtre
            """
            super(Quelclient, self).__init__(parent)
            self.setWindowTitle("Quel client ?")
            self.resize(300,100)
     
            # crée un lineEdit
            self.lineEdit = QtWidgets.QLineEdit(self)
     
            # crée un bouton
            self.bouton = QtWidgets.QPushButton("Ok", self)
            self.bouton.clicked.connect(self.ok_m)
     
            # positionne les widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.lineEdit, 0, 0)
            posit.addWidget(self.bouton, 1, 0)
            self.setLayout(posit)
     
        @QtCore.pyqtSlot()
        def ok_m(self):
            """ferme la fenêtre en renvoyant par signal le nom du client saisi
               dans le QLineEdit
            """
            # émet un signal "fermeturequelclient()" avec l'argument cité
            self.fermeturequelclient.emit(self.lineEdit.text())
            # ferme la fenêtre
            self.close()
     
    #############################################################################
    class Principal(QtWidgets.QMainWindow):
     
        def __init__(self, parent=None):
            """Initialise la fenêtre
            """
            super(Principal, self).__init__(parent)
            self.setWindowTitle("Fenêtre principale")
            self.resize(300,100)
     
            # met un fond dans le QMainWindow)
            self.setCentralWidget(QtWidgets.QFrame())
     
            # crée un lineEdit
            self.label = QtWidgets.QLabel(self.centralWidget())
     
            # crée un bouton
            self.bouton = QtWidgets.QPushButton("Sélectionnez un client !", self.centralWidget())
            self.bouton.clicked.connect(self.quelclient_m)
     
            # positionne les widgets sur le fond de la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            posit.addWidget(self.label, 1, 0)
            self.centralWidget().setLayout(posit)
     
        @QtCore.pyqtSlot()
        def quelclient_m(self):
            """Lance la 2ème fenêtre en cas de clic sur le bouton
            """
            # crée la 2ème fenêtre
            self.quelclient = Quelclient()
            # en cas de signal "fermeturequelclient" de self.quelclient 
            #   => exécutera la méthode clienchoisi
            self.quelclient.fermeturequelclient.connect(self.clientchoisi)
            # rend modale la 2ème fenêtre (la 1ère fenêtre sera inactive)
            self.quelclient.setWindowModality(QtCore.Qt.ApplicationModal)
            # affiche la 2ème fenêtre
            self.quelclient.show()
     
        @QtCore.pyqtSlot(str)
        def clientchoisi(self, client):
            """affiche le nom du client transmis par le signal 'fermeturequelclient'
               à l'arrêt de la 2ème fenêtre
            """
            self.label.setText("Client: %s" % client)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create('plastique'))
        main = Principal()
        main.show()
        sys.exit(app.exec_())

  3. #3
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Par défaut
    j'ai réussi la connexion de la deuxième interface mais sa bloque déçu je ne sais pas pour quoi.
    sinon il y a besoin forcement que la deuxième interface retourne un signal a la premier class?
    car je n'ai pas d'action qui doit aller sur la premier interface mais dans ma base de donner (elle doit être fermer manuellement et non après avoir appuyer sur un bouton).

    voila comment je me connecte a ma deuxième class.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.MyApp2= MyApp2()
    self.MyApp2.setWindowModality(QtCore.Qt.NonModal)
    self.MyApp2.show()
    et l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception "unhandled AttributeError"
     'NoneType' object has no attribute 'setObjectName'
    viens de l’interface il bloque a cause de sa : Option.setObjectName("Option")
    il n'y a pas de raison a cette erreur!? si ?

  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
    Je n'ai pas assez d'info: qu'est-ce que c'est que l'objet <Option>? C'est lui qui est None et qui empêche l'utilisation de la méthode <setObjectName>.

    Si tu ne donnes pas plus de code, on ne peut pas deviner.

  5. #5
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Par défaut
    Option est le nom de l’interface
    pour le code tu le veut le code complais ou juste ciblé ?

  6. #6
    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
    Citation Envoyé par lekev262 Voir le message
    Option est le nom de l’interface
    "interface" est un mot trop général: ça ne me dit pas ce que c'est: une classe qui hérite de quoi? un fichier qu'on importe? etc...

    Citation Envoyé par lekev262 Voir le message
    pour le code tu le veut le code complais ou juste ciblé ?
    Surtout pas le code complet! Dis surtout comment tu crées l'objet <option> qui se trouve être à None!

  7. #7
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Par défaut
    ok alors la class principal est pour géré la premier interface graphique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyApp(QMainWindow, Ui_MangaHystory):
     
      def __init__(self,parent=None):
        QWidget.__init__(self)
        self.setupUi(parent)
     
        self.pushOption.clicked.connect(self.option)
     
      def option(self):
        self.MyApp2 = MyApp2()
        self.MyApp2.setWindowModality(QtCore.Qt.NonModal)
        self.MyApp2.show()
    la deuxième class est pour géré la deuxième interface graphique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MyApp2(QWidget, Ui_Option):
     
      def __init__(self,parent=None):
        QWidget.__init__(self)
        self.setupUi(parent)
    et l'interface graphique option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Ui_Option(object):
        def setupUi(self, Option):
            Option.setObjectName("Option")
            Option.resize(220, 290)
    si tu a besoin de plus tu me le dit je l'ajoute de suite!

  8. #8
    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
    Suis bien le déroulement:

    Comme tu n'as mis aucun parent, parent=None dans le __init__ de MyApp2

    Et tu passes parent=None comme argument de setupUi, ce qui fait que l'argument Option de setupUi sera égal à None

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option.setObjectName("Option")
    Et c'est là que ça ne va pas: None n'a pas une telle méthode.

    En fait, le setupUi ressemble à ce qui est généré par le Qt Designer: est-ce le cas?

    Si oui, il faut appeler:

    Car le "parent" à passer est l'instance de la classe (la fenêtre) MyApp2 et non le parent de la classe (la fenêtre) MyApp

  9. #9
    Membre actif
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Par défaut
    ah oui... le parent=none est pour la premier interface vu qu'il n'y a pas de précédent mais la j'en est un ce qui pose problème
    bien sur une fois que je le retire sa marche
    mes sincère remerciement tyrtamos
    le jour ou tu donnera des cour je m'abonne ! (sauf si tu le fait déjà lol)

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

Discussions similaires

  1. [QtCore] Appeler une deuxième fenêtre et en retourner une valeur
    Par dourouc05 dans le forum PyQt
    Réponses: 5
    Dernier message: 04/03/2015, 11h14
  2. coment afficher un champ dans une deuxiéme fenêtre.
    Par loic20h28 dans le forum WinDev
    Réponses: 2
    Dernier message: 03/03/2008, 14h36
  3. [Lazarus][Débutant] Afficher une deuxième fenêtre
    Par 'ti programmeur dans le forum Lazarus
    Réponses: 6
    Dernier message: 12/02/2007, 22h06
  4. Création d'une deuxième fenêtre windows
    Par stabilo dans le forum MFC
    Réponses: 5
    Dernier message: 03/03/2006, 19h44

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