Ключевое слово ids
Ключевые слова ids (идентификаторы) и id (идентификатор) используются для идентификации виджетов. С использованием ключевого слова id можно любому виджету назначить уникальное имя (идентификатор). Это имя можно использовать для ссылок на виджет, то есть обратиться к нему в коде на языке KV. Рассмотрим следующий код:
Button:
id: but1
text: "Кнопка 1"
Label:
text: but1.text
В этом коде создано два элемента интерфейса: виджет Button (кнопка), и виджет Label (метка). Кнопке через ключевое слово id присвоено уникальное имя – but1, через которое теперь можно обращаться к свойствам данного элемента. Свойству text метки Label присвоено значение but1.text. То есть метка обратилась к кнопке bat1 и получила от кнопки значение его свойства text. В итоге метка покажет на экране текст «Кнопка 1».
Рассмотрим это на простейшем примере:
Демонстрация использования ключевого слова id
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 = "Метка"
В итоге после касания всех элементов содержание метки будет меняться.
С использованием ключевого слова ids можно из кода на Python обратиться к виджету, который создан в разделе программы в коде на KV.
Демонстрация использования ключевого слова ids
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
Рассмотрим использование идентификаторов виджетов для обмена параметрами между фрагментами кода на языке KV и на Python, на развернутом примере простейшего калькулятора.
Демонстрация использования ключевых слов ids и id
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. После запуска приложения получим следующий результат:
