kivy屏幕。我必须用super初始化吗?

时间:2016-10-31 14:20:45

标签: python kivy super

来自docs

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

从此SO question

class WelcomeScreen(Screen):
    def __init__(self, **kwargs):
        super(Screen,self).__init__(**kwargs)

在哪种情况下需要使用super来初始化屏幕?为什么?

1 个答案:

答案 0 :(得分:7)

简答:

在定义屏幕时,不必使用super。是的,您总是必须使用super __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'

如果要在实例化已创建的类时设置屏幕的布局,内容,属性等,而不在.kv文件中定义这些内容,则将使用__init__;要做到这一点,你还需要超级如上所述。尽管可以使用.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