2016-03-08 59 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