web-dev-qa-db-ja.com

AttributeError:モジュール 'PyQt5.QtGui'に属性 'QWidget'がありません

だから、私はpythonコードのUIを作成しようとしていますが、問題に出くわし続けています...

現在、すべてのコードは、2つのテキストエディターボックスと1つのボタンでウィンドウを作成するだけです。ボタンを押すと、「テスト」と印刷されます。

QTDesignerを使用してUIを作成し、次にPyQt5を使用してそれをPythonに変換し、コードを編集しました。

私のコード:

_   # -*- 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_())
_

これは私が得るエラーです:

_AttributeError: module 'PyQt5.QtGui' has no attribute 'QWidget'
_

class Ui_Widget(QtGui.QWidget):class Ui_Widget(QtGui.QtWidgets):に変更しても、_AttributeError: module 'PyQt5.QtGui' has no attribute 'QtWidgets'_が返されます

問題が何であるかを知っている人は誰ですか?

乾杯。

7
CandyGum

あなたのエラーはここからです:

_Ui_Widget(QtGui.QWidget)
_

それは基本的に何が問題なのかを教えてくれます。

インポートはQT5スタイルなので、QT4とQT5を混在させているようですが、QtGui.QWidgetはQT4スタイルのように見えます。

次の行に置き換えます:

_Ui_Widget(QtWidgets.QWidget)
_

docs に従って互換性があるはずです

備考:私はあなたが本当に何をしているのかわかりませんが、これに言及すると: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'それは正しいです。 PyQt5.QtGuiからではなく、すでにQtWidgetsをインポートしました。そこではUi_Widget(QtWidgets)を使用するだけです。

つまり、これらすべてのエラーは、QT4とQT5の間のモジュールに関するリファクタリングに関連しているようです。ドキュメントが役立つはずです。

13
sascha