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 :

Qt designer PYTQT5 une fenetre ouvrant une autre fenetre fail :(


Sujet :

PyQt Python

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2013
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 229
    Points : 109
    Points
    109
    Par défaut Qt designer PYTQT5 une fenetre ouvrant une autre fenetre fail :(
    Bonjour

    soft python 3.8 et PyQT5

    voila j'ai 2 fichiers qui ouvrent une fenêtre a partir de fichier UI générer par QT designer.

    chaque fichier testé séparément fonctionne bien.

    mais quand je clique sur le bouton "button_import_sn" du fichier 1 qui doit ouvrir la fenêtre du fichier2.py
    J'ai le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QCoreApplication::exec: The event loop is already running
    après qques recherche c'est la ligne self.app.exec() dans le fichier2 qui est le pb puisqu'une session app.Exec est déjà lancé par le fichier 1
    si je le retire la fenetre2 s'ouvre rapidement et se referme

    please help me

    Merci d'avance de votre aide



    fichier1.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
     
    import sys
     
    from package.communication_gmot import liste_sn_of
    #from package.interface import trackingwindows
    from PyQt5 import QtCore, QtGui, QtWidgets, uic ,Qt
    from PyQt5.QtWidgets import QTreeWidgetItem, QSizePolicy, QAction, QPushButton
    from PyQt5.QtGui import QFont,QIcon, QPixmap
    from fichier2 import window2
     
    class window1():
     
        def __init__(self):
     
            self.app = QtWidgets.QApplication([])
            self.WIN1= uic.loadUi("./UIQT/WIN1.ui")
            self.WIN1.button_import_sn.clicked.connect(self.open_win2)
     
        def show(self):
            self.WIN1.show()
            self.app.exec()
     
        def open_win2(self):
     
            win2 = window2
            win2.show()
     
    if __name__ == "__main__":
        Win_1= window1()
        Win_1.show()

    fichier2.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
     
    import sys
     
    from package.communication_gmot import liste_sn_of
    #from package.interface import trackingwindows
    from PyQt5 import QtCore, QtGui, QtWidgets, uic ,Qt
    from PyQt5.QtWidgets import QTreeWidgetItem, QSizePolicy, QAction, QPushButton
    from PyQt5.QtGui import QFont,QIcon, QPixmap
     
    class window2():
     
        def __init__(self):
     
            self.app = QtWidgets.QApplication([])
            self.win2= uic.loadUi("./UIQT/WIN2.ui")
     
        def show(self):
            self.win2.show()
            self.app.exec()
     
    if __name__ == "__main__":
        Win_2= window2()
        Win_2.show()

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

    Ça ne marche pas comme ça. La boucle de gestion des évènements est unique (sauf avec QDialog): il faut la lancer sous la ligne: if __name__ == "__main__":, et de ce fait, elle ne sera pas exécutée lors d'une importation.

    Par ailleurs, il faut que chaque fenêtre soit présentée sous forme d'une classe héritant de la classe de base de Qt (QWidget, QMainWindow, etc...). Cela permettra autant que nécessaire de surcharger les méthodes d'origine pour modifier l'apparence et le comportement de la fenêtre.

    Voilà un code de principe:

    Fichier principal: fenetre1.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
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    from fenetre2 import Fenetre2
     
    #############################################################################
    class Fenetre1(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.resize(300, 200)
            self.setWindowTitle("Fenêtre 1")
     
            self.bouton = QtWidgets.QPushButton("Lancer la fenêtre 2", self)
            self.bouton.clicked.connect(self.clictest)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
        #========================================================================
        def clictest(self, checked=None):
            self.fen2 = Fenetre2()
            self.fen2.show()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre1()
        fen.show()
        sys.exit(app.exec_())
    Fichier contenant une 2ème fenêtre à lancer: fenetre2.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
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    # importation des paramètres QWidget définis dans QtDesigner
    from fenetre2_ui import Ui_Form
     
    #############################################################################
    class Fenetre2(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            # connexion aux paramètres définis dans QtDesigner
            self.ui = Ui_Form()
            self.ui.setupUi(self)
     
            self.resize(300, 200)
            self.setWindowTitle("Fenêtre 2")
     
    #############################################################################
    if __name__ == "__main__":
     
        # ce qui suit ne sera pas utilisé en cas d'importation:
     
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Dans ce 2ème fichier, j'ai simulé qu'il existe un autre fichier fenetre2_ui issu de QtDesigner, et qui a définit les paramètres d'un QWidget. Je parle bien de "paramètres", car le fichier ui ne crée par la fenêtre elle-même: c'est pour ça qu'on crée la fenêtre "Fenetre2" comme une classe héritant de QWidget et qui intègre les paramètres. Dans cette classe, tous les objets définis dans QtDesigner seront accessibles avec self.ui....

    Dans un 1er temps, il suffit de commenter ('#') les 3 lignes suivantes pour exécuter l'appel de la 2ème fenêtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from fenetre2_ui import Ui_Form
    ...
            self.ui = Ui_Form()
            self.ui.setupUi(self)

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2013
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Novembre 2013
    Messages : 229
    Points : 109
    Points
    109
    Par défaut
    hello


    super merci

    Je vais tester tout cela

    ++

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

Discussions similaires

  1. Une fenetre ouvrant une autre a partir d'un choix
    Par farwest dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 22/04/2008, 20h32
  2. [Sécurité] Sessions PHP d'une fenetre à une autre
    Par creascript.com dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2005, 11h10
  3. Gérer fenetre tierce d'une application à partir d'une autre
    Par narutobaka dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/09/2005, 13h01
  4. Afficher une fenetre par rapport a une autre
    Par luffy0013 dans le forum MFC
    Réponses: 4
    Dernier message: 14/02/2005, 22h16
  5. Réponses: 2
    Dernier message: 24/11/2004, 11h01

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