2016-10-31 11 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-файле; для этого вам также понадобится супер, как описано выше. Это хорошая практика в kivy, хотя использовать .kv-файл, когда сможете.

В этом примере я хочу иметь доступ к родительскому дому BottomBar с self.caller, который я передаю как ** 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, я могу модифицировать класс корневого виджета и переменные доступа, которые могут быть созданы в корневом виджете во время выполнения (например, переменные, полученные из объекта pipe)? – Moritz

+0

@Moritz Если вы используете __init__, вы перезаписываете инициализацию по умолчанию, которая вызывается __init__ родительского класса и так далее по иерархии. Вам либо нужен супервызов, либо базовый класс .__ init __() явно указан. С супер вы можете передать параметры родительскому классу. – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^