~~META: &title = Классы и объекты &keywords = Kivy python KV &audience = alle ~~ **Классы и объекты** По мере того, как приложение усложняется, становится трудно поддерживать конструкцию дерева виджетов и явное объявление привязок. Чтобы преодолеть эти недостатки, альтернативой является язык KV, также известный как //язык Kivy// или //KVlang//. //Язык KV// позволяет создавать дерево виджетов в декларативной манере, позволяет очень быстро создавать прототипы и оперативно вносить изменения в пользовательский интерфейс. Это также помогает отделить логику приложения от пользовательского интерфейса. Язык KV, как и Python, является объектно-ориентированным языком. Все элементы интерфейса представляют собой объекты, которые строятся на основе базовых классов. Каждый класс имеет набор свойств, зарезервированных методов и событий, которые могут быть обработаны с помощью функций. В языке KV принято соглашение: имя класса всегда начинается с заглавной буквы (например, //Button// – кнопка, //Label// – метка), а имя свойства с маленькой буквы (например, //text//, //text_size//, //font_size//). Самый простой способ использования классов в KV – это употребление их оригинальных имен. Проверим это на простом примере. Создадим файл с именем K_May_Class1.py и напишем в нем следующий код: # модуль K_May_Class1.py from kivy.app import App from kivy.lang import Builder KV =''' BoxLayout: # контейнер (базовый класс BoxLayout) Button: # кнопка (класс Button) text: "Кнопка" # свойство кнопки (надпись) ''' class MainApp (App): def build (self): return Builder.load_string(KV) if __name__ == '__main__': MainApp().run() # запуск приложения В этом коде в текстовой переменной KV создан виджет – контейнер на основе базового класса //BoxLayout//, в нем размещена кнопка (//Button//), свойству кнопки text присвоено значение "Кнопка" (на языке KV свойство от его значения отделяется знаком двоеточия «:»). При этом нет необходимости явно импортировать базовые классы, они загрузятся автоматически. После запуска приложения получим следующий результат: {{ :kivy:003.png?400 |}} Разработчик может в коде на Python переопределить имя базового класса, то есть создать собственный пользовательский класс. Например, разработчик хочет использовать класс //BoxLayout//, но при этом дать ему другое имя, например, //MyBox//. Проверим это на простом примере: # модуль K_May_Class1.py from kivy.app import App from kivy.lang import Builder from kivy.uix.boxlayout import BoxLayout KV =''' MyBox: # контейнер (пользовательский класс) Button: # кнопка (класс Button) text: "Кнопка" # свойство кнопки (надпись) ''' # пользовательский класс MyBox # на основе базового класса BoxLayout class MyBox(BoxLayout): pass class MainApp (App): def build (self): return Builder.load_string(KV) if __name__ == '__main__': MainApp().run() # запуск приложения При этом нужно явно выполнить импорт базового класса BoxLayout: from kivy.uix.boxlayout import BoxLayout Или же можно вообще без KV: from kivy.app import App from kivy.lang import Builder from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button # пользовательский класс MyBox # на основе базового класса BoxLayout class MyBox(BoxLayout): def __init__(self, **args): super(MyBox, self).__init__(**args) button=Button( text="Кнопка") self.add_widget(button) class MainApp (App): def build (self): return MyBox() if __name__ == '__main__': MainApp().run() # запуск приложения Однако есть более простой способ создания пользовательского класса непосредственно в коде на языке KV. Для этого используется следующая конструкция: <Имя_пользовательского_класса@Имя_базового_класса> Проверим это на простом примере: from kivy. app import App from kivy.lang import Builder KV = ''' # пользовательский класс MyBox # на основе базового класса BoxLayout MyBox: # контейнер (пользовательский класс) Button: # кнопка (класс Button) text: "Кнопка" # свойство кнопки (надпись на кнопке) ''' class MainApp (App): def build (self): return Builder.load_string(KV) if __name__ == '__main__': MainApp().run() При этом не нужно явно выполнить импорт базового класса //BoxLayout//, и не нежно объявлять пользовательский класс в разделе программы на Python.