2016-03-08 141 views
1

我努力学习GUI实现,其中包括我的UI文件到我的Python脚本:蟒蛇:桂错误消息

from PySide.QtGui import * 
import sys 
import MultiTool_widget_ui 

'''class MainDialog (QDialog, MultiTool_widget_ui.Ui_Form): 
    def __init__(self): 
     self.setupUi(MainDialog)''' 

app = QApplication(sys.argv) 
w = MultiTool_widget_ui.Ui_Form() 
#w = MainDialog() 
w.setupUi(QDialog) 
w.show() 
app.exec_() 

执行,我收到此错误信息:

Traceback (most recent call last): File "C:\Users\jhofmann\workspace\Testumgebung\GUI.py", line 17, in w.setupUi(QDialog) File "C:\Users\jhofmann\workspace\Testumgebung\MultiTool_widget_ui.py", line 14, in setupUi Form.setObjectName("Form") TypeError: descriptor 'setObjectName' requires a 'PySide.QtCore.QObject' object but received a 'str'

指向这个代码行中的“setupUi” - ui文件中的方法:

from PySide import QtCore, QtGui 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName("Form") <--HERE! 
     Form.resize(400, 300) 
     self.lcdNumber = QtGui.QLCDNumber(Form) 
     self.lcdNumber.setGeometry(QtCore.QRect(0, 110, 64, 23)) 
     self.lcdNumber.setObjectName("lcdNumber") 
     self.pushButton = QtGui.QPushButton(Form) 
     self.pushButton.setGeometry(QtCore.QRect(70, 110, 75, 23)) 
     self.pushButton.setObjectName("pushButton") 

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

原因是什么?我用PY 3.4

(注释的块,来自视频教程的那些)

+0

请出示完整的错误消息回溯,并指示在上面的代码,它标记就行了。 –

+0

我编辑了我的问题。 – Creatronik

+1

您正在关注的教程的URL是什么? –

回答

0

您正在尝试一个类的对象传递给setupUi,当它期待一个实例类。试试这个:

from PySide.QtGui import * 
import sys 
import MultiTool_widget_ui 

class MainDialog (QDialog, MultiTool_widget_ui.Ui_Form): 
    def __init__(self): 
     super(MainDialog, self).__init__() 
     self.setupUi(self) 

app = QApplication(sys.argv) 
w = MainDialog() 
w.show() 
app.exec_() 

注:上述多继承方法,在Qt Designer中定义的所有部件最终成为顶级部件的属性。所以,如果你加入Qt设计一个按钮叫pushButton,你可以一个插槽连接到它是这样的:

class MainDialog (QDialog, MultiTool_widget_ui.Ui_Form): 
    def __init__(self): 
     ... 
     self.pushButton.clicked.connect(self.handleButton) 

    def handleButton(self): 
     print('Hello World') 
+0

好吧,它是缺少超级。由于我是面向对象编程的新手,我必须学习这一点。在教程中没有解释什么是“超级”,所以我试着不理解。 – Creatronik

+0

为了正确理解,我试图交换超级继承运算符,但是我无法理解使用的__init __-方法来自哪里,因为Ui_Form-Class没有这样的方法。所以它必须属于QDialog。请帮我在这里。 – Creatronik

+0

@Creatronik。如果你不重写'__init__',python会自动调用所有基类的'__init__'。所以当你**重写'__init__'时,你必须*自己明确地执行这一步。使用'super'是最简单的方法。而在python3中,它实际上更简单一些,因为你可以使用'super().__ init __()'(我在我的例子中使用了长期版本来向后兼容)。 – ekhumoro