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 :

Problème module d'importation


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Problème module d'importation
    Bonjour,

    Je cherche à concevoir une petite application graphique avec le module QtGui.
    N'ayant pas trouvé de solution sur le forum prévu à cet effet, je tente ici.

    Mon erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'module' object has no attribute 'QAction'
    Donc j'ai essayé une commande qui a l'air d'avoir résolu pas mal de problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    class MainWindow(QtWidgets.QMainWindow, UI.MainUI.Ui_MainWindow):
    Le problème étant que UI de UI.MainUI est signalé en rouge sur mon IDE, je ne sais pas du tout comment résoudre ce problème.. Si jamais quelqu'un a une idée !

    Bon week-end

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

    Je suppose, bien que ce ne soit pas dit, qu'il s'agit d'importer un module créé par QtDesigner (fichier ".ui") et traité ensuite pas pyuic5 (=> fichier ".py").

    Pour l'importation, voici la logique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    from mondessin import Ui_MainWindow # pour importer mondessin.py issu de mondessin.ui
     
    class Mafenetre(QtWidgets.QMainWindow, Ui_MainWindow):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.setupUi(self)
    Ce n'est pas la seule solution. Ici, on a créé une classe à héritage multiple. C'est plus simple, mais il y a un inconvénient: les attributs (méthodes, variables) de la classe QMainWindow seront mélangés aux attributs de la classe Ui_MainWindow: attention aux "collisions" (attributs de même nom). Quand ça arrive, c'est quelquefois difficile à debuguer!

    Autre solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    from mondessin import Ui_MainWindow # pour importer mondessin.py issu de mondessin.ui
     
    class Mafenetre(QtWidgets.QMainWindow):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    De cette façon, les attributs de Ui_MainWindow seront trouvés dans la classe Mafenetre en les préfixant par "ui", et donc sans risque de mélange. Par exemple, le contenu d'un widget "QLineEdit" appelé "lignedit" de mondessin.py sera trouvé par self.ui.lignedit.text().
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Tout d'abord un très grand merci pour ce message bien détallé.

    Je vais tester vos différentes options et je reviens au plus vite pour commenter cela.

    Bon dimanche

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    J’ai essayé différentes solutions avec les exemples que vous m’avez proposé.

    Pour vous expliquer sur mon fichier .py, j’ai créée une barre de navigation avec différentes fonctions, et notamment la possibilité d’enregistrer l’application.

    Et c’est là que mon souci s’est posé avec le module QAction.

    Voici le code en question, avec vos suggestions (que j’ai probablement mal adapté)

    L'erreur en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    super().__init__(parent)
     
    RecursionError: maximum recursion depth exceeded while calling a Python object
    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
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog, QTextEdit, QAction
    from PyQt5.QtCore import QDir
    class Ui_MainWindow(QtWidgets.QMainWindow):
     
        def setupUi(self, parent=None):
            super().__init__(parent)
     
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            MainWindow.setObjectName("MainWindow")
     
     
     
            saveAction = QtGui.QAction("&Save File", self)
            self.saveAction.setText(_translate("MainWindow", "Enregistrer"))
            self.saveAction.setShortcut(_translate("MainWindow", "Ctrl+S"))
            self.saveAction.setStatusTip('Save File')
            self.saveAction.triggered.connect(self.file_save)
     
            self.mainMenu = self.menubar()
            self.fileMenu.addAction(saveAction)
     
    ...
     
        def file_save(self):
            name = QtGui.QFileDialog.getSaveFileName(self, 'Save File')
            file = open(name, 'w')
            text = self.textEdit.toPlainText()
            file.write(text)
            file.close()
     
     
     
    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_())

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

    Il y a plusieurs erreurs de code qui expliquent l'erreur à l'exécution.

    J'ai corrigé les plus grosses ci-dessous, mais je n'ai pas pu essayer puisque je n'ai pas le fichier à importer.

    En particulier:
    - pas d'importation du fichier issu de QtDesigner? (cas 2 de mon message précédent)
    - lorsque la classe héritant de QMainWindow est appelée, la méthode qui l'initialise automatiquement s'appelle "__init__".
    - créer la classe "Ui_MainWindow" et l'appeler dans son initialisation (self.ui = Ui_MainWindow()) n'est pas logique et ne peut conduire qu'à une boucle infinie
    - l'appel à cette classe sous le 'if __name__ == "__main__":' n'est pas correct.

    Attention: la programmation graphique est complexe et particulièrement PyQt5 en contrepartie de sa puissance, mais les erreurs ici concernent surtout Python: je suggère de commencer par un bon tuto pour le Python de base comme celui-ci: https://python.developpez.com/cours/apprendre-python3/. Il s'agit d'un simple problème d'efficacité: quand on ne connait pas les bases, aucun projet de développement ne peut avancer...

    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
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    from mondessin import Ui_MainWindow # <== pour importer mondessin.py issu de mondessin.ui
     
    class MaFenetre(QtWidgets.QMainWindow):
     
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
     
            self.setWindowTitle("MainWindow") # <== titre de la fenêtre
     
    ...
    ...
    ...
     
     
    if __name__ == "__main__":
     
        import sys
        app = QtWidgets.QApplication(sys.argv)
     
        maFenetre = MaFenetre()
        maFenetre.show()
     
        sys.exit(app.exec_())
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2020
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2020
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci beaucoup pour vos conseils et vos remarques, je vais continuer mon apprentisage du langage.

    Bonne continuation

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

Discussions similaires

  1. [Python 3.X] Problème sur l'import de mes modules
    Par Thomas404 dans le forum Général Python
    Réponses: 7
    Dernier message: 21/11/2019, 14h00
  2. Problème de syntaxe importation Excel
    Par evans dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/04/2006, 18h02
  3. Problème avec l'import DTS SQL Serveur 2005
    Par dlan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/03/2006, 11h47
  4. Problème sur export import fromuser touser
    Par tomsawyer dans le forum Oracle
    Réponses: 3
    Dernier message: 19/12/2005, 11h15
  5. Problème champ après import d'excel vers access
    Par David M dans le forum Access
    Réponses: 6
    Dernier message: 16/10/2005, 11h53

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