来自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
初始化屏幕,为什么?
最佳答案
简答:
不,您不必在定义屏幕时使用 super。是的,您总是需要使用 super 来 __init__
(如果您使用 __init__
)。
更长的答案:
这不是屏幕独有的。在文档示例中,您没有调用 __init__
并传递任何参数,因此不需要 super
。您不需要 __init__
调用来定义 Kivy 屏幕。从 SO 问题来看,如果您正在运行 __init__
,那么您正在将 **kwargs 向上传递到对象层次结构,并且还重新定义了 __init__
,这通常会运行父类。 super
用于允许您传递 **kwargs 并运行父 __init__
而无需显式调用父类,在本例中为 Screen
继承自 RelativeLayout
,后者本身继承自 FloatLayout
;如果没有 super 调用,您将覆盖父类。
你不需要调用 __init__
除非你需要它。这是我的一个应用程序的 Screen
,没有 __init__
调用(布局在 .kv 文件中设置):
class LoginScreen(Screen):
def login(self):
self.parent.current = 'ParameterScreen'
如果你想在实例化你创建的类时设置屏幕的布局、内容、属性等,而不在.kv中定义这些东西,你将使用__init__
文件;为此,您还需要 super 如上所述。在 kivy 中,尽可能使用 .kv 文件是一种很好的做法。
在这个例子中,我希望能够使用 self.caller 访问 BottomBar 的父级,我在创建它时将其作为 **kwargs 传入,并在栏被实例化后立即定义它;所以我需要在 __init__
中定义它,这需要一个 super 调用。
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
关于python - 基维屏幕。我必须用 super 初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344081/