web-dev-qa-db-fra.com

AttributeError: le module 'PyQt5.QtGui' n'a pas d'attribut 'QWidget'

Donc, j'essaie de faire une interface utilisateur pour un code python que j'ai, mais je continue de tomber sur des problèmes ...

À l'heure actuelle, tout le code ne fait qu'une fenêtre, avec 2 zones de texte et un bouton. Lorsque le bouton est enfoncé, il imprime "Test".

J'ai utilisé QTDesigner pour créer l'interface utilisateur, puis PyQt5 pour le convertir en python et édité le code.

Mon code:

   # -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'widget.ui'
#
# Created by: PyQt5 UI code generator 5.9
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Widget(QtGui.QWidget):
    def setupUi(self, Widget):
        Widget.setObjectName("Widget")
        Widget.resize(681, 382)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Widget)
        self.horizontalLayout.setContentsMargins(11, 11, 11, 11)
        self.horizontalLayout.setSpacing(6)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.in_box = QtWidgets.QTextEdit(Widget)
        self.in_box.setMaximumSize(QtCore.QSize(200, 350))
        self.in_box.setObjectName("in_box")
        self.horizontalLayout.addWidget(self.in_box)
        self.convert = QtWidgets.QPushButton(Widget)
        self.convert.setObjectName("convert")
        self.horizontalLayout.addWidget(self.convert)
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setContentsMargins(11, 11, 11, 11)
        self.gridLayout.setSpacing(6)
        self.gridLayout.setObjectName("gridLayout")
        self.out_box = QtWidgets.QTextEdit(Widget)
        self.out_box.setMaximumSize(QtCore.QSize(200, 350))
        self.out_box.setObjectName("out_box")
        self.gridLayout.addWidget(self.out_box, 6, 0, 1, 1)
        self.horizontalLayout.addLayout(self.gridLayout)

        self.retranslateUi(Widget)
        QtCore.QMetaObject.connectSlotsByName(Widget)

    def retranslateUi(self, Widget):
        _translate = QtCore.QCoreApplication.translate
        Widget.setWindowTitle(_translate("Widget", "Converter"))
        self.convert.setText(_translate("Widget", "Convert"))
    self.convert.clicked.connect(self.convertclick)

    def convertclick(self):
        print ('Test')



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Widget = QtWidgets.QWidget()
    ui = Ui_Widget()
    ui.setupUi(Widget)
    Widget.show()
    sys.exit(app.exec_())

Voici l'erreur que j'obtiens:

AttributeError: module 'PyQt5.QtGui' has no attribute 'QWidget'

Même lorsque je change class Ui_Widget(QtGui.QWidget): en class Ui_Widget(QtGui.QtWidgets): j'obtiens AttributeError: module 'PyQt5.QtGui' has no attribute 'QtWidgets'

Quelqu'un qui sait quel est le problème?

À votre santé.

7
CandyGum

Votre erreur vient d'ici:

Ui_Widget(QtGui.QWidget)

Il vous indique essentiellement quel est le problème.

Il semble que vous mélangiez du QT4 et du QT5 ici car votre importation est de style QT5, mais QtGui.QWidget ressemble au style QT4.

Remplacez la ligne par:

Ui_Widget(QtWidgets.QWidget)

qui devrait être compatible selon le docs

Remarque: je ne sais pas ce que vous faites vraiment, mais quand vous mentionnez ceci: Even when I change class Ui_Widget(QtGui.QWidget): to class Ui_Widget(QtGui.QtWidgets): I get AttributeError: module 'PyQt5.QtGui' has no attribute 'QtWidgets' C'est correct. Vous avez déjà importé QtWidgets, et non depuis PyQt5.QtGui. Utilisez simplement Ui_Widget (QtWidgets) là-bas.

En bref: toutes ces erreurs semblent être liées au refactoring en ce qui concerne les modules entre QT4 et QT5. Les documents devraient aider.

13
sascha