~~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.