Ключевые слова //ids// (идентификаторы) и //id// (идентификатор) используются для идентификации виджетов. С использованием ключевого слова id можно любому виджету назначить уникальное имя (идентификатор). Это имя можно использовать для ссылок на виджет, то есть обратиться к нему в коде
на языке KV.
Рассмотрим следующий код:
Button:
id: but1
text: "Кнопка 1"
Label:
text: but1.text
В этом коде создано два элемента интерфейса: виджет Button (кнопка), и виджет Label (метка). Кнопке через ключевое слово //id// присвоено уникальное имя – //but1//, через которое теперь можно обращаться к свойствам данного элемента. Свойству text метки Label присвоено значение ''but1.text''. То есть метка обратилась к кнопке //bat1// и получила от кнопки значение его свойства text. В итоге метка покажет на экране текст "Кнопка 1".
Рассмотрим это на простейшем примере:
from kivy. app import App
from kivy.lang import Builder
KV = '''
BoxLayout:
orientation: 'vertical'
Button:
id: bt1
text: "Кнопка 1"
on_press: lb1.text = bt1.text
Button:
id: bt2
text: "Кнопка 2"
on_press: lb1.text = bt2.text
Label:
id: lb1
text: "Метка"
on_touch_down: self.text = "Метка"
'''
class MainApp (App):
def build (self):
return Builder.load_string(KV)
if __name__ == '__main__':
MainApp().run()
В этом модуле создан корневой виджет BoxLayout. Затем в корневой виджет вложено три элемента: две кнопки Button, и метка Label. Кнопки имеют идентификаторы "bt1" и "bt2", а метка идентификатор "lb1". При касании кнопки bt1 (событие on_press) свойству метки text будет присвоено значение аналогичного свойства кнопки bt2, что запрограммировано в выражении:
on_press: lb1.text = bt1.text
При касании кнопки bt2 (событие ''on_press'') свойству метки text будет присвоено значение аналогичного свойства кнопки bt2, что запрограммировано в выражении:
on_press: lb2.text = bt2.text
При касании метки lb1 (событие ''on_touch_down'') свойству метки text будет присвоено значение "Метка", что запрограммировано в выражении:
on_touch_down: self.text = "Метка"
В итоге после касания всех элементов содержание метки будет меняться.
{{ :kivy:010.png?400 |}}
С использованием ключевого слова //ids// можно из кода на Python обратиться к виджету, который создан в разделе программы в коде на KV.
from kivy. app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
KV = '''
box:
Button:
text: "Кнопка 1"
on_press: root.result ("Нажата кнопка")
Label:
id: lb1
text: "Метка"
'''
class box (BoxLayout):
def result (self, entry_text):
self.ids["lb1"].text = entry_text
class MainApp (App):
def build (self):
return Builder.load_string(KV)
if __name__ == '__main__':
MainApp().run()
Здесь во фрагменте модуля, написанного на Python, создан пользовательский класс //box// на основе базового класса BoxLayout. Это по своей сути контейнер, в который на языке KV вложено два элемента: кнопка Button и метка Label, которая имеет имя (идентификатор) //lb1//. При касании кнопки возникает событие (on_press). Это событие обрабатывается в корневом виджете root, в функции result, куда передается текст "Нажата кнопка". В функции //result// этот текст принимается в параметр //entry_text//. А вот в следующей строке как раз происходит использование ключевого
слова ids:
self.ids["lb1"].text = entry_text
Эта строка говорит о том, что свойству text элемент корневого виджета с именем (идентификатором) ''["lb1"]'' нужно присвоить значение параметра entry_text. Поскольку данному параметру будет передано значение "Нажата кнопка", то этот текст отобразится на экране. Альтернативно можно использовать синтаксис:
self.ids.lb1.text = entry_text
{{ :kivy:011.png?400 |}}
Рассмотрим использование идентификаторов виджетов для обмена параметрами между фрагментами кода на языке KV и на Python, на развернутом примере простейшего калькулятора.
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
KV='''
box:
id:root_widget
orientation:'vertical'
TextInput:
id:entry
font_size:32
miltiline:False
Button:
text:"="
font_size:64
on_press:root_widget.result(entry.text)
Label:
id:total
text:"Итого"
font_size:64
'''
class box(BoxLayout):
def result(self,entry_text):
if entry_text:
try:
result=str(eval(entry_text))
self.ids["total"].text=result
except Exception:
self.ids["total"].text="Ошибка"
class MainApp(App):
def build(self):
return Builder.load_string(KV)
MainApp().run()
В этом модуле создан базовый класс приложения MainApp, который обеспечивает запуск приложения, и пользовательский класс box на основе базового класса BoxLayout (контейнер – коробка). В этом классе создана функция //result//, в которой происходят вычисления.
В коде на языке KV созданы следующие элементы интерфейса:
* корневой виджет box (id: root_widget);
* поле для ввода текста TextInput (id: entry);
* кнопка для запуска процесса выполнения расчетов;
* метка Label для вывода на экран результатов расчета (id: total).
С использованием имен-идентификаторов происходит обмен данными межу фрагментами кода на языке KV и на Python. После запуска приложения получим следующий результат:
{{ :kivy:012.png?400 |}}