PyQT 参数错误

1 投票
2 回答
1437 浏览
提问于 2025-04-18 05:18

我刚开始学习编程和Python,遇到了一个关于参数的错误,运行我的一个类时出错了。但是我不太明白这是什么意思,也不知道哪里出了问题。错误信息是:Type:Error __init__() takes exactly 2 arguments (1 given)

以下是我的代码:

import os, sys
from PyQt4.QtGui import *
from PyQt4 import QtGui, QtCore

class mainUI(QtGui.QMainWindow):
        def __init__(self):
                super(mainUI, self).__init__()
                self.mainUI()

        def mainUI(self):

                self.showFullScreen()
                self.setWindowTitle('TimeBot')

                palette = QPalette()
                palette.setBrush(QPalette.Background, QBrush (QPixmap ("Resources/bg1.jpg")))
                self.setPalette(palette)

                qbtn = QtGui.QPushButton('Quit', self)
                qbtn.clicked.connect(QtCore.QCoreApplication.quit)
                qbtn.move(5,5)
                self.button = qbtn             
                qbtn.show()

class labelTest(QtGui.QWidget):
        def __init__(self, parent):
                super(labelTest, self).__init__(parent)

                lbl = QtGui.QLabel("This is a test", self)
                lbl.move(50, 50)

                self.show()

def main():
        app = QtGui.QApplication(sys.argv)

        env = mainUI()
        labels = labelTest()   

        sys.exit(app.exec_())

if __name__ == '__main__':
        main()

2 个回答

1

你在创建标签的时候没有传递parent这个参数。也就是说,你写的labels = labelTest()缺少了必要的信息。

根据我的经验,通常的做法是把parent参数的默认值设置为None

class labelTest(QtGui.QWidget):
        def __init__(self, parent=None):
        ...

错误信息告诉你,函数(__init__)期望有两个参数(self, parent),但实际上只收到了一个。这个收到的参数self是每个类的函数自动传入的。

补充一下:

如果你想在主窗口中显示这个标签,你需要把主窗口作为父级传进去。
你应该这样写:labels = labelTest(env)

而且你还需要稍微修改一下labelTest类,以便移动的是小部件,而不是标签本身。

class labelTest(QtGui.QWidget):
        def __init__(self, parent):
                super(labelTest, self).__init__(parent)

                lbl = QtGui.QLabel("This is a test", self)
                self.move(50, 50)

                self.show()
2

你不需要显示一个 QPushButton。 (当然,如果你不想让它出现在一个单独的窗口里。)

你需要为你的窗口设置一个布局,并把这个按钮(还有标签)添加到这个布局里。

class mainUI(QtGui.QDialog):

QMainWindow已经设置了一个布局。(我觉得是这样,如果我错了请纠正我。)

   def __init__(self, parent=None):
       super(mainUI, self).__init__()
       self.mainUI()
       self.show()

这很重要(它会显示窗口)。

   def mainUI(self):
       layout = QtGui.QVBoxLayout(self)

这段代码创建了一个布局;你也可以使用QHBoxLayout。 ... # 不会移动(因为有布局) # 不要用qbtn.show()(这样会创建一个新窗口。) layout.addWidget(qbtn) 这行代码把按钮放进了布局里。 self.setLayout(layout) 这行代码把窗口的布局设置为我们新创建并填充的布局。

class labelTest(QtGui.QLabel):

这应该是一个标签,对吧?

   def __init__(self, parent):
      super(labelTest, self).__init__("This is a test",parent)
      # no new QLabel
      # no moving (because there's a layout)
      ...
      # no self.show() (since we don't want to create a new window)

def main():
   ...
   env.layout().addWidget(labelTest())

这行代码创建了一个新的labelTest,并把它添加到当前的env布局里。

   ...

如果你想多了解一些,我推荐你看看PySide的文档。这是一个不同的Qt绑定用于Python,但它的API非常相似。

撰写回答