Programado
Docs» kivy:ids

Ключевое слово 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. После запуска приложения получим следующий результат:

Previous Next

Programado

Table of Contents

Содержание

  • Kivy
  • Процессор_x86-64
  • Вход