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

Mor*_*itz 4 python super kivy

来自文档:

# Declare both screens
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass
Run Code Online (Sandbox Code Playgroud)

从这个SO问题:

class WelcomeScreen(Screen):
    def __init__(self, **kwargs):
        super(Screen,self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 7

简短回答:

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

更长的回答:

这对屏幕来说并不是唯一的.在docs示例中,您不是在调用__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'
Run Code Online (Sandbox Code Playgroud)

你会使用__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
Run Code Online (Sandbox Code Playgroud)