Partage
  • Partager sur Facebook
  • Partager sur Twitter

[pyQt] Une fenêtre qui en ouvre une autres

The event loop is already running

    26 janvier 2014 à 1:54:29

    Salut à tous!

    Je viens vers vous car j'ai un petit souci avec python (3.3) et pyQt (dans sa version 4).

    J'ai deux classe pour deux fenêtres :

    class Window1():
    	def test(self):
                    Window2()
    
    	def __init__(self):
    		self.app = QtGui.QApplication(sys.argv)
    		window = QtGui.QWidget()
    		window.setWindowTitle("Window1")
    window.resize(425,370) # des attributs et d'autres trucs cool # et ce bouton ! btn = QtGui.QPushButton("Nouvelle Facture", window # et plus bas : btn.connect(btn, QtCore.SIGNAL("clicked()"), self.test) # en finissant par window.show() self.app.exec_() class Window2(): def __init__(self): self.app = QtGui.QApplication(sys.argv) window = QtGui.QWidget() window.setWindowTitle("Window2") window.resize(425,370) window.show() self.app.exec_()

    Comme vous pouvez le constater, le clic sur le bouton fait appel au constructeur de Window2. Il est donc supposé m'afficher une deuxième fenêtre. Le truc c'est que j'ai cette erreur :

    QCoreApplication::exec: The event loop is already running 

    Donc voilà...
    Un coup de main ?

    Merci d'avance :) 

    -
    Edité par Que20maar 26 janvier 2014 à 1:57:19

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2014 à 14:25:49

      Bonjour,

      Ton problème vient de

      self.app.exec_()

      C'est ta boucle d'évènements de Qt.

      Idem pour

      self.app = QtGui.QApplication(sys.argv)


      qui ne sert pas à grand chose non plus dans ton cas.

      Un seul exemplaire suffit pour initialiser PyQt et sa boucle d'évènements dans ton 'main' lors de l'exécution. Inutile de de répéter ces lignes dans chaque classe.

      Après tu as un problème de durée d'existence de ta méthode Window2 (portée): ici elle va se refermer immédiatement.

      Je te recommande de lier l'existence de ton objet Window 2 à la classe qui l'instancie, sinon il sera détruit une fois ton code parcouru à l'exécution, grâce à self.objectName et d'initialiser par "None" (autant prendre de bonnes habitudes):

      self.window = None

      Voici la solution, testée sur Python 2.7.5:

      #! /usr/bin/env python
      # -*- coding: utf-8 -*-
      import sys
      from PyQt4 import QtGui, QtCore
      
      
      class Window1():
      
          def __init__(self):
              # Initialisation
              self.wind2 = None
              self.window = None
      
              self.window = QtGui.QWidget()
              self.window.setWindowTitle("Window1")
              self.window.resize(425, 370)
      
              btn = QtGui.QPushButton("Nouvelle Facture", self.window)
      
              # Signal:
              btn.connect(btn, QtCore.SIGNAL("clicked()"), self.test)
              # Nouvelle écriture de signaux: btn.clicked.connect(self.test)
              # --> squelette: objet.SIGNAL.connect(calledFonction)
      
              self.window.show()
      
          def test(self):
              self.wind2 = Window2()
      
      
      class Window2():
          def __init__(self):
              self.window = None  # Initialisation
              self.window = QtGui.QWidget()
              self.window.setWindowTitle("Window2")
              self.window.resize(425, 370)
              self.window.show()
      
      
      if __name__ == '__main__':
          app = QtGui.QApplication(sys.argv)  # Intialise PyQt
          w1 = Window1()  # Instance de la classe Window1
          app.exec_()  # Ici une fois suffit.
          sys.exit(app.exec_())  # Quitte Qt
      


      Améliorations possibles:

      La nouvelle écriture de connecteur (tu as le squelette ainsi que le code adapté à ton exemple dans la solution) et, si tu l'utilises n'importe que:

      from PyQt4.QtGui import QApplication, QWidget, QPushButton

      Dans ce cas, supprime 'QtGui.' dans tes déclarations d'objet Qt.

      Bonne chance pour la suite!

      • Partager sur Facebook
      • Partager sur Twitter

      [pyQt] Une fenêtre qui en ouvre une autres

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown