2014-08-31 80 views
0

我使用Python 3 PyQt4的和:python類繼承def __init位?

我有一個一流的:

class MainWindow(QtGui.QWidget): 

    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.initUI() 

使用此功能在它:

def Fn_GetSpnBitsValue(self): 
     print (self.SpnBits.value()) 
     self.BitNumber =self.SpnBits.value() 
     print(self.BitNumber) 
     return self.BitNumber 

,你可以看到我的價值迴歸我在此類中創建的一個紡紗器 現在,我想從另一個類訪問此變量「self.BitNumber」。 在其他語言中,我會非常簡單地寫myValue = MainWindow.self.BitNumber,但它似乎不會像python一樣容易,所以我看看類繼承,所以我的第二類繼承我的第一個類...

我將非常想寫這樣的...:

class BitsWindow(QtGui.QWidget, MainWindow): 
    def __init__(self): 
     super(BitsWindow, self).__init__() 
     self.initUI2() 

這使得完美SENS給我,我告訴我的第二課堂「看你從該類繼承等等一切,她知道,你知道它還有」但我然後收到此消息錯誤:

class BitsWindow(QtGui.QWidget, MainWindow): 
TypeError: Cannot create a consistent method resolution 
order (MRO) for bases QWidget, MainWindow 

其實並沒有對我產生任何影響。通過在網絡上看得更遠我想知道,關鍵是在該位:

def __init__(self): 
     super(BitsWindow, self).__init__() 
     self.initUI2() 

但我真的掙扎理解概念,我不知道這是什麼東西,儘管許多教程和論壇的答案做。 (也許,可能沒有找到好的。)

任何幫助將不勝感激;

非常感謝!

+0

你應該提到的Python版本和Qt綁定包(PySide,PyQt4的,PyQt5)。 – Schuh 2014-08-31 12:08:06

+0

道歉非常正確:Python 3與PyQt4(也在帖子中添加)。謝謝。 – 2014-08-31 12:29:05

回答

1

問題是,即BitsWindow繼承自QWidgetMainWindow,即使MainWindow已經是QWidget

這破壞了python的策略,以確定哪個例如其中__init__方法它應該使用的QWidget所述一個或從MainWindow所述一個:

MainWindow定義告訴蟒QWidget的那些之前採取MainWindow。 當您定義BitsWindow(QWidget, MainWindow)時,您給予QWidget優先於MainWindow。 這兩種策略相互碰撞,這就是爲什麼你會得到錯誤。

所以,只要你的類定義從

class BitsWindow(QtGui.QWidget, MainWindow): 
... 

class BitsWindow(MainWindow): 
... 

FWIW改變,你也可以保持冗餘QWidget繼承,如果你真的想,如果你更改順序:

class BitsWindow(MainWindow, QWidget): 
    ... 

也應該工作。

編輯:

繼承可能然而,不是實際上是你想要的。 你可以得到這一結果簡單地從MainWindow一個實例訪問它:

main = MainWindow() 
myValue = main.Fn_GetSpnBitsValue() 

main.Fn_GetSpnBitsValue() 
myValue = main.BitNumber 
+0

哈哈當然是!因爲MainWindow已經從QtGui.QWidget繼承了! 但現在我的問題是,我得到所有的佈局/按鈕......在我的第二堂課中,我只是想要訪問一個函數的結果,而我的整個第一堂課的副本已經過去了。 – 2014-08-31 13:18:59

+0

謝謝,我現在看到更好。所以我只需要實例化我的類來訪問它中的東西。這確實令人感到震驚。 只有一件事打擾了我,我訪問的函數的結果與我直接在第一類或第二類中打印的結果不一樣。從我的第二個類訪問Fn_GetSpnBitsValue()將永遠返回我的微調(1)的默認值,無論它實際上是什麼值。 – 2014-08-31 13:59:31

+0

嗨,你的答案實際上仍然是一個問題。 主=主窗口() myvalue的= main.Fn_GetSpnBitsValue() 或 main.Fn_GetSpnBitsValue() myvalue的= main.BitNumber 這樣做在我的第一個類的新實例得到myvalue的,而不是從現有的得到它目前頭等艙:/ – 2014-09-02 20:16:25