2016-10-31 42 views

回答

5

簡短的回答:

不,你沒有定義屏幕時使用超。是的,你總是必須__init__超級(如果你使用__init__)。

較長的答案:

沒什麼獨特的屏幕。在文檔示例中,您不會調用__init__並傳遞任何參數,因此不需要super。您不需要撥打__init__來定義Kivy屏幕。從SO問題來看,如果你正在運行__init__,你將** kwargs傳遞給對象層次結構,並重新定義__init__,這通常會運行父類的初始化。 super用於允許您傳遞** kwargs並運行父代__init__而不顯式調用父類,在這種情況下,Screen繼承自RelativeLayout,它本身繼承自FloatLayout;如果沒有超級召喚,你會覆蓋父類。

除非您有一些使用它,否則不需要致電__init__。下面是從我的應用程序之一Screen,沒有__init__調用(佈局設置在.kv文件):

class LoginScreen(Screen): 
    def login(self): 
     self.parent.current = 'ParameterScreen' 

您將使用__init__如果要設置佈局,內容,性質等。當你實例化你創建的類而沒有在.kv文件中定義這些東西的時候,要做到這一點,你還需要如上所述的超級。儘管在可以的時候使用.kv文件,但在kivy中是一個很好的練習。

在這個例子中,我希望能夠通過self.caller訪問BottomBar的父項,我在創建它時將它作爲** kwargs傳入,並且在實例化該欄時立即定義它;所以我需要定義它在__init__這需要超級電話​​。

class BottomBar(ActionBar): 
    titletext = StringProperty('') 
    def __init__(self,**kwargs): 
     self.caller = kwargs.get('caller') 
     super(BottomBar,self).__init__(**kwargs) 
    def change_title(self,newtitle): 
     self.titletext = newtitle 
+0

這是否意味着,如果我沒有超級繼承就像這個例子:https://github.com/kivy/kivy/wiki/Data-driven-variables-with-kivy-properties,我可以修改根部件類和訪問變量,這些變量可能在執行期間在根部件中生成(例如,從管道對象中獲取變量)? – Moritz

+0

@Moritz如果你正在使用__init__,你正在覆蓋默認的初始化,它會調用父類的__init__,等等。你需要一個超級調用或一個明確命名的BaseClass .__ init __()。超級可以將參數傳遞給父類。 – Daniel