PyQT 参数错误
我刚开始学习编程和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 个回答
你在创建标签的时候没有传递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()
你不需要显示一个 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非常相似。