__init__() 缺少 1 个必需的位置参数:'self' [关闭]

Posted

技术标签:

【中文标题】__init__() 缺少 1 个必需的位置参数:\'self\' [关闭]【英文标题】:__init__() missing 1 required positional argument: 'self' [closed]__init__() 缺少 1 个必需的位置参数:'self' [关闭] 【发布时间】:2019-04-28 18:32:58 【问题描述】:

我是 QT 新手,我尝试使用 QT 设计器创建一个小部件。 我现在正在尝试连接按钮,同时还使用继承来编辑另一个 Ui_Form 类。

这是主文件:

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from HunterVsBoar import Ui_Form


class PythonGame(QtWidgets.QWidget, Ui_Form):
    def __init__(PythonGame, self):
        def __init__(self, parent = None):
            super(PythonGame, self).__init__(parent)
            self.ui = Ui_Form()
            self.ui.setupUi(self)

            self.attack_btn.clicked.connect(self, self.start_attack)
            self.heal_btn.clicked.connect(self, self.heal_hunter)
            self.start_btn.clicked.connect(self, self.event_start)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = PythonGame()
    Form.show()
    sys.exit(app.exec_())

这是转换后的ui文件:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):


    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1037, 885)
        self.horizontalLayoutWidget = QtWidgets.QWidget(Form)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 819, 1031, 61))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.attack_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        font = QtGui.QFont()
        font.setFamily("Yu Gothic UI Semibold")
        font.setBold(True)
        font.setWeight(75)

        self.attack_btn.setFont(font)
        self.attack_btn.setObjectName("attack_btn")
        self.horizontalLayout.addWidget(self.attack_btn)

        self.heal_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.heal_btn.setCheckable(False)
        self.heal_btn.setObjectName("heal_btn")
        self.horizontalLayout.addWidget(self.heal_btn)

        self.dmg_btn = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.dmg_btn.setObjectName("dmg_btn")
        self.horizontalLayout.addWidget(self.dmg_btn)

        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 1041, 311))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")

        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")

        self.textBrowser_2 = QtWidgets.QTextBrowser(self.verticalLayoutWidget)
        self.textBrowser_2.setObjectName("textBrowser_2")
        self.verticalLayout.addWidget(self.textBrowser_2)

        self.textBrowser_1 = QtWidgets.QTextBrowser(self.verticalLayoutWidget)
        self.textBrowser_1.setObjectName("textBrowser_1")
        self.verticalLayout.addWidget(self.textBrowser_1)

        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(440, 790, 131, 16))
        self.label.setObjectName("label")

        self.hp_hunter = QtWidgets.QProgressBar(Form) 
        self.hp_hunter.setGeometry(QtCore.QRect(10, 790, 118, 23))
        self.hp_hunter.setProperty("value", 100)
        self.hp_hunter.setObjectName("hp_hunter")

        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(40, 770, 47, 13))
        self.label_2.setObjectName("label_2")

        self.hp_boar = QtWidgets.QProgressBar(Form)
        self.hp_boar.setGeometry(QtCore.QRect(900, 790, 118, 23))
        self.hp_boar.setProperty("value", 100)
        self.hp_boar.setObjectName("hp_boar")

        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(930, 770, 47, 13))
        self.label_3.setObjectName("label_3")

        self.start_btn = QtWidgets.QPushButton(Form)
        self.start_btn.setGeometry(QtCore.QRect(370, 630, 75, 23))
        self.start_btn.setObjectName("start_btn")

        self.stop_btn = QtWidgets.QPushButton(Form)
        self.stop_btn.setGeometry(QtCore.QRect(520, 630, 75, 23))
        self.stop_btn.setObjectName("stop_btn")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Hunter vs Boar"))
        self.attack_btn.setText(_translate("Form", "Attack"))
        self.heal_btn.setText(_translate("Form", "Heal"))
        self.dmg_btn.setText(_translate("Form", "Damage potion"))
        self.label.setText(_translate("Form", "What do you want to do?"))
        self.label_2.setText(_translate("Form", "Hunter"))
        self.label_3.setText(_translate("Form", "Boar"))
        self.start_btn.setText(_translate("Form", "Start!"))
        self.stop_btn.setText(_translate("Form", "Stop!"))

我一启动 main.py,就会收到以下错误:

__init__() missing 1 required positional argument: 'self'

Form = PythonGame() 被标记时。

有人能帮我吗?就像我说的,我对 Python 编程比较陌生,对 *** 也很陌生,所以如果我做错了什么请不要杀了我 lmao

(哦,为了澄清与连接语句的任何混淆 = 这些函数存在,我只是从这段代码中删除了它们,因为我认为它们并不重要(因为它们不是问题))

【问题讨论】:

嵌套的__init__是复制粘贴错误吗?如果没有,那么这就是你的问题。 【参考方案1】:

PythonGame__init__函数不对,应该是:

class PythonGame(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
       QWidget.__init__(self, parent=parent)
       self.ui = Ui_Form()
       self.ui.setupUi(self)
       self.attack_btn.clicked.connect(self, self.start_attack)
       self.heal_btn.clicked.connect(self, self.heal_hunter)
       self.start_btn.clicked.connect(self, self.event_start)

【讨论】:

【参考方案2】:

__init__() 中的self 是对自身实例的引用,并作为类方法的第一个参数放置。可以指定其他参数。在你所拥有的东西中,PythonGame 充当传统上的self 并且它将self 作为另一个参数。摆脱 PythonGame 参数,你应该没问题。既然是类方法,就知道是PythonGame的一部分

def __init__(self):

来自documentation

通常,方法的第一个参数称为 self。这只不过是一个约定:名称 self 对 Python 绝对没有特殊含义。但是请注意,如果不遵循约定,您的代码对于其他 Python 程序员的可读性可能会降低,并且还可以想象编写依赖于这种约定的类浏览器程序。

【讨论】:

【参考方案3】:

您的外部自我方法不正确。您应该只为任何类属性传递 self 和任何必要的参数。

你的代码应该是这样的:

class PythonGame(QtWidgets.QWidget, Ui_Form):
def __init__(self):
    def __init__(self, parent = None):
        super(PythonGame, self).__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

【讨论】:

【参考方案4】:

看起来有两个交换的参数。 而不是:

class PythonGame(QtWidgets.QWidget, Ui_Form):
    def __init__(PythonGame, self):

应该是:

class PythonGame(QtWidgets.QWidget, Ui_Form):
    def __init__(self, PythonGame):

但是PythonGame 是你的班级名称,可能它不应该在那里,不是吗? 这样就可以了

class PythonGame(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent = None):
        super(PythonGame, self).__init__(parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        self.attack_btn.clicked.connect(self, self.start_attack)
        self.heal_btn.clicked.connect(self, self.heal_hunter)
        self.start_btn.clicked.connect(self, self.event_start)

【讨论】:

我看不出为什么PythonGame 应该在那里。应该是def __init__(self): 嘿,我也意识到了这一点,重新阅读最初的代码,我发现有两个级别的 init 我也从最新的代码块中删除了。 是的,编辑后答案会更好。我评论了一个早期版本。 成功了,非常感谢!我希望我没有把自己弄成白痴,lmao。 @David 当然不是,这里是提问的正确地方:)

以上是关于__init__() 缺少 1 个必需的位置参数:'self' [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:__init__() 缺少 1 个必需的位置参数:“单位”

Spyder 未以 TypeError 开头:__init__() 缺少 1 个必需的位置参数

如何修复modelformset错误:__init __()缺少1个必需的位置参数:'user'

类型错误:__init__() 缺少 2 个必需的位置参数:“arr”和“n”

错误:__ init __()缺少1个必需的位置参数:'rec'

如何修复 TypeError:main.__init__() 缺少 3 个必需的位置参数:'num1'、'num2' 和 'operator' [关闭]