基维屏幕。我必须用超级初始化吗?

kivy screens. Do I have to initialize with super?

来自docs

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

从这个:

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

什么情况下需要用super初始化屏幕,为什么?

简答:

不,您不必在定义屏幕时使用 super。是的,你总是必须 __init__ 与超级(如果你使用 __init__)。

更长的答案:

这不是屏幕独有的。在文档示例中,您没有调用 __init__ 并传递任何参数,因此不需要 super。您不需要调用 __init__ 来定义 Kivy 屏幕。从 SO 问题来看,如果你 运行ning __init__ 你正在传递 **kwargs 对象层次结构并且还重新定义 __init__ 通常 运行父级初始化 class。 super 用于允许您传递 **kwargs 和 运行 父 __init__ 而无需显式调用父 class,在这种情况下,Screen继承自 RelativeLayout,它本身继承自 FloatLayout;如果没有 super 调用,您将覆盖父级 class.

您不需要调用 __init__ 除非您需要它。这是来自我的一个应用程序的 Screen,没有 __init__ 调用(布局在 .kv 文件中设置):

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

如果你想在实例化你创建的 class 时设置屏幕的布局、内容、属性等,你将使用 __init__ 而没有定义这些东西.kv 文件;为此,您还需要 super 如上所述。在 kivy 中,尽可能使用 .kv 文件是一种很好的做法。

在这个例子中,我希望能够使用 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