Язык разметки kv замечательная вещь. О его свойствах еще будет разговор, а пока представляю вашему вниманию немного трюков при работе с kv.
Если что-то упустил, то подробнее можно, конечно,прочитать в документации.
Пример немного глупый, но всё же. Допустим, надо чтобы число на кнопке росло на 2 при каждом нажатии (событие on_press). Всё просто. Добавляем в описание кнопки поле foo (или любое другое, отличное от полей объектов Kivy) и помещаем в него значение кнопки при следующем нажатии.
Button:
text: '1'
foo:int(self.text)+2
on_press: self.text = str(self.foo)
Много ли языков разметки позволяют использовать функции и процедуры ?
О других языках не скажу, но Kivy может. Как?
Вот пример:
#:import os os
<RootWidget>:
Button:
text: os.getcwd()
Главное здесь вот эта строка:
#:import os os
Понимать ее надо так:
#:import <alias> <package/class>
В пункте 1 речь идет об использовании свойств объектов, как переменных. Здесь же мы просто создадим переменную, с которой можем работать внутри разметки.
#:set var0 2
#:set var1 'Hello'
Button:
text: var0
Label:
text: var1
Для обращения к классам и объектам разметки во внешних файлах есть команда include:
#:include <filename>
Вызываем команду в начале файла и можем начинать использовать в разметке объекты из других kv-файлов.
Снова вспомним пункт 1:
Button:
text: '1'
foo:int(self.text)+2
on_press: self.text = str(self.foo)
Мы преобразуем текст в число и обратно, используя функции Python внутри kv. Удобно, верно?
А теперь изменим задачу. Хотим, чтобы текст на кнопке рос до 21, а потом снова становился единицей:
Button:
Button:
text: '1'
foo: int(self.text)+2
on_press:
if self.foo > 21: self.text = '1'
else: self.text = str(self.foo)
Для таких простых вещей не надо лезть в скрипт и писать там методы для корневого класса. Несложная логика прекрасно дополняет разметку.
И приятный бонус под финал:
Button:
on_press:
self.text += '1';print('Hello ',self.text)
Сколько точно команд можно поместить в событие мне неизвестно, но точно достаточно, чтобы сделать интерфейс ваших программ "живее" и отзывчивее!
Спасибо за внимание!:metal: