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 :

PyQT5 Menu Bar ouvrir une nouvelle fenêtre ! [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut PyQT5 Menu Bar ouvrir une nouvelle fenêtre !
    Bonjour,

    Je souhaite ouvrir une nouvelle fenêtre avec le menu bar avec un développement sous PyQT5 / Qt Designer / et python 3.7.

    Ma fenêtre principale main.py


    Aux lignes 30-32 j'ai bien utilisé les outils: sender / signal / receiver / slot pour le point de menu "Quitter"
    Mais comment faire pour ouvrir la seconde fenêtre avec le point de menu "Nouveau" ?
    Je n'ai rien trouvé à ce sujet. Merci beaucoup par avance.

    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
     
    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets
    from formSecond import Ui_formSecond
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            self.menuFiles = QtWidgets.QMenu(self.menubar)
            self.menuFiles.setObjectName("menuFiles")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.actionNew = QtWidgets.QAction(MainWindow)
            self.actionNew.setObjectName("actionNew")
            self.actionEnd = QtWidgets.QAction(MainWindow)
            self.actionEnd.setObjectName("actionEnd")
            self.menuFiles.addAction(self.actionNew)
            self.menuFiles.addAction(self.actionEnd)
            self.menubar.addAction(self.menuFiles.menuAction())
     
            self.retranslateUi(MainWindow)
            self.actionEnd.triggered.connect(MainWindow.close)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
     
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menuFiles.setTitle(_translate("MainWindow", "Fichier"))
            self.actionNew.setText(_translate("MainWindow", "Nouveau"))
            self.actionEnd.setText(_translate("MainWindow", "Quitter"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    voici ma seconde fenêtre fromSecond.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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    # -*- coding: utf-8 -*-
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
     
    class Ui_formSecond(object):
        def setupUi(self, formSecond):
            formSecond.setObjectName("formSecond")
            formSecond.resize(661, 378)
            self.centralwidget = QtWidgets.QWidget(formSecond)
            self.centralwidget.setObjectName("centralwidget")
            self.label = QtWidgets.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(180, 150, 282, 37))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(24)
            font.setBold(True)
            font.setWeight(75)
            self.label.setFont(font)
            self.label.setObjectName("label")
            formSecond.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(formSecond)
            self.statusbar.setObjectName("statusbar")
            formSecond.setStatusBar(self.statusbar)
     
            self.retranslateUi(formSecond)
            QtCore.QMetaObject.connectSlotsByName(formSecond)
     
        def retranslateUi(self, formSecond):
            _translate = QtCore.QCoreApplication.translate
            formSecond.setWindowTitle(_translate("formSecond", "MainWindow"))
            self.label.setText(_translate("formSecond", "Second formulaire"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        formSecond = QtWidgets.QMainWindow()
        ui = Ui_formSecond()
        ui.setupUi(formSecond)
        formSecond.show()
        sys.exit(app.exec_())

  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,

    Je ne vois pas trop où est le problème, tu fais comme pour le menu Quitter, tu connectes ton action à une fonction et dans celle-ci tu ouvres ta fenêtre secondaire.

  3. #3
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut
    Merci VinsS,

    Mais pourriez vous s'il vous plaît juste me montrer comment faire la 1ère connexion qui consiste à ouvrir le "formSecond", car je passe de Tkinter à PyQT5 et je n'ai pas trouvé grand chose.
    Une fois que je comprendrai la construction sémantique, je pourrai voler de mes propres ailes. Sur le Net il n'y a que des tutos concernant le lancement via des boutons.

  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
    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            self.actionEnd.triggered.connect(MainWindow.close)
            self.actionNew.triggered.connect(self.create_new_document)
            ...
     
        def create_new_document(self):
            formSecond = QtWidgets.QWidget()
            ui = Ui_formSecond()
            ui.setupUi(formSecond)
            ret = formSecond.exec_()
    mais il n'y a qu'un label dans ta deuxième fenêtre ...

  5. #5
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut
    Merci beaucoup

    mais il n'y a qu'un label dans ta deuxième fenêtre ...
    Oui j'ai juste mis un "Hello world" pour le test.

    Alors il y a quelque chose qui m'échappe, car j'ai 2 messages d'erreurs qui sont liés.
    Pourtant je fais bien l'import du formSecond.
    Est-ce que 'create_new_document' est fait pour ouvrir une nouvelle fenêtre ?


    Traceback (most recent call last):
    File "C:/Users/xxxxxxx/main.py", line 56, in <module>
    ui.setupUi(MainWindow)
    File "C:/Users/xxxxxx/main.py", line 34, in setupUi
    self.actionNew.triggered.connect(self.create_new_document)
    AttributeError: 'Ui_MainWindow' object has no attribute 'create_new_document'

    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
     
    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets
    from formSecond import Ui_formSecond
     
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
     
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            self.menuFiles = QtWidgets.QMenu(self.menubar)
            self.menuFiles.setObjectName("menuFiles")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.actionNew = QtWidgets.QAction(MainWindow)
            self.actionNew.setObjectName("actionNew")
            self.actionEnd = QtWidgets.QAction(MainWindow)
            self.actionEnd.setObjectName("actionEnd")
            self.menuFiles.addAction(self.actionNew)
            self.menuFiles.addAction(self.actionEnd)
            self.menubar.addAction(self.menuFiles.menuAction())
     
            self.retranslateUi(MainWindow)
            self.actionEnd.triggered.connect(MainWindow.close)
            # ---
            self.actionNew.triggered.connect(self.create_new_document)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menuFiles.setTitle(_translate("MainWindow", "Fichier"))
            self.actionNew.setText(_translate("MainWindow", "Nouveau"))
            self.actionEnd.setText(_translate("MainWindow", "Quitter"))
     
            def create_new_document(self):
                formSecond = QtWidgets.QWidget()
                ui = Ui_formSecond()
                ui.setupUi(formSecond)
                ret = formSecond.exec_()
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        # ----
        formSecond = QtWidgets.QMainWindow()
        ui = Ui_formSecond()
        ui.setupUi(formSecond)
        formSecond.show()
        # ---
        sys.exit(app.exec_())

  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
    Parce que tu l'as indentée un niveau trop loin, tu en as fait une sous fonction de retranslateUi().

    D'autre part, dans le bloc if __name__ == "__main__": efface tout ce qui concerne la seconde fenêtre.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/04/2010, 13h35
  2. [GTK] ouvrir une nouvelle fenêtre depuis un menu
    Par danathane dans le forum Interfaces Graphiques
    Réponses: 18
    Dernier message: 06/01/2009, 16h01
  3. ouvrir une nouvelle fenêtre dans une taille déterminé
    Par lnikolanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/09/2005, 15h26
  4. Ouvrir une nouvelle fentre en grand ?
    Par Sylk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 15/09/2005, 13h14
  5. [ShellExecute] ouvrir une nouvelle fenêtre ie
    Par sony351 dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/11/2004, 18h39

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