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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    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
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    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
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    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.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut
    Merci tu es super et j'y suis presque.

    Tu as raison j'avais mal indenté et voilà mon code modifié avec ma fonction positionnée en début de code (lignes 11-15).
    Ma fenêtre main apparaît bien, l'action "Quitter" du menu bar fonctionne bien, mais quand je clic sur nouveau ou "new" tout disparaît comme tu me l'as fait remarqué.

    D'autre part, dans le bloc if __name__ == "__main__": efface tout ce qui concerne la seconde fenêtre.
    Quelle est la logique pour PyQT et comment cela doit s'écrire pour que je comprenne... je ne veux pas abuser, mais c'est la dernière ligne droite !


    Process finished with exit code -1073740791 (0xC0000409)

    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
     
    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets
    from formSecond import Ui_formSecond
     
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
     
            # ---
            def create_new_document():
                formSecond = QtWidgets.QWidget()
                ui = Ui_formSecond()
                ui.setupUi(formSecond)
                ret = formSecond.exec_()
     
            # ---
            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(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"))
     
     
    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_())

  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
    Tu as fait pire qu'avant pour l'indentation, ton code doit être comme ceci:
    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
     
    # -*- 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(create_new_document)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def create_new_document(self):
            formSecond = QtWidgets.QWidget()
            ui = Ui_formSecond()
            ui.setupUi(formSecond)
            ret = formSecond.exec_()
     
        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_())

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut
    Je comprends, mais je l'avais positionné là après plusieurs essais parce que cela ne marchait pas.

    J'ai donc utiliser ta contribution pour laquelle je te remercie, mais cela bug encore quelque part.
    Voici le message... là je ne vois pas bien la logique, car si je fais précéder le self.actionNew.triggered.connect(create_new_document) de ma fonction "create_new_document" là elle est reconnue, mais ça ne va toujours pas.

    Traceback (most recent call last):
    File "C:/Users/xxxxx/main.py", line 56, in <module>
    ui.setupUi(MainWindow)
    File "C:/Users/xxxxx/main", line 33, in setupUi
    self.actionNew.triggered.connect(create_new_document)
    NameError: name 'create_new_document' is not defined
    Normalement pas d'erreur

    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
    # -*- 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(create_new_document)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def create_new_document(self):
            formSecond = QtWidgets.QWidget()
            ui = Ui_formSecond()
            ui.setupUi(formSecond)
            ret = formSecond.exec_()
     
        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_())

  10. #10
    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
    Pourquoi as-tu enlevé le self ?
    self.actionNew.triggered.connect(self.create_new_document)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut
    Bonjour VinsS,

    Oups ! désolé, un moment d'égarement. Voici donc mon code qui marche pour "Quitter", mais pour "New" j'ai ce message ci-après :

    Process finished with exit code -1073740791 (0xC0000409)
    Et la seconde fenêtre ne s'ouvre pas.

    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
    # -*- 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 create_new_document(self):
            formSecond = QtWidgets.QWidget()
            ui = Ui_formSecond()
            ui.setupUi(formSecond)
            ret = formSecond.exec_()
     
        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_())

  12. #12
    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
    C'est pas un message d'erreur python ça.

    En fait je ne m'étais pas trop préoccupé du second script, mais tu lui attribues des méthodes réservées au QMainWindow ce qui ne marche pas bien sur.

    Ta seconde fenêtre comme ceci:
    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
     
    class Ui_formSecond:
        def setupUi(self, formSecond):
            formSecond.setObjectName("formSecond")
            formSecond.resize(661, 378)
            self.label = QtWidgets.QLabel(formSecond)
            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")
            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"))
    et dans la fonction d'appel tu changes QWidget par QDialog
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def create_new_document(self):
            formSecond = QtWidgets.QDialog()
    ça fonctionne sous Linux.

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 191
    Par défaut Résolu
    Merciiiii super,

    Effectivement cela fonctionne et maintenant je comprends mieux, car je m'étais posé la question pour "QDialog" et j'avais évacuer cette idée.
    Car, la plupart des tutos que j'avais vu, étaient des boîtes de dialogue "oui/non" etc...
    Maintenant je comprends mieux la structure de PyQT5 par rapport à Tkinter où l'on utilisait des "Toplevel".
    Gracias... je mets à la disposition de tout mon code documenté pour le "main" et le "second formulaire".

    main.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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets
    # Import of the second form
    from formSecond import Ui_formSecond
     
    """
    The object of this code is to open a second window by using the toolsbar 
    and the "New" menu item rather than using a button
    """
     
     
    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())
     
            # Creation of the connection for the "close" function
            self.retranslateUi(MainWindow)
            self.actionEnd.triggered.connect(MainWindow.close)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
            # Creation of the connection for the "create_new_document" function
            self.actionNew.triggered.connect(self.create_new_document)
     
        # the "create_new_document" function. Beware of indentation !
        def create_new_document(self):
            formSecond = QtWidgets.QDialog()
            ui = Ui_formSecond()
            ui.setupUi(formSecond)
            ret = formSecond.exec_()
     
        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_())
    Le code pour le second formulaire "formSecond"

    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
    # -*- coding: utf-8 -*-
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_formSecond:
        def setupUi(self, formSecond):
            formSecond.setObjectName("formSecond")
            formSecond.resize(661, 378)
            self.label = QtWidgets.QLabel(formSecond)
            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")
            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_())

+ 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