Как получить доступ к id / widget другого класса из файла kivy (.кв)?

что я хочу знать?

  1. если кнопка с id: button_b (Get_Boys class) выпущена, то метка с id: label_g (Get_Girls class) должна измениться.
  2. если нажата кнопка с id: button_b (класс Get_Boys), то метка с id: root_lbl (класс Get_People) должна измениться.
  3. если кнопка с id: root_btn (Get_People class) выпущена, то метка с id: label_b (Get_Boys class) должна измениться.

Это объяснил (мало) в этой ссылка, но не с точки зрения новичка.

у меня есть 2 файлы

  1. test.py
  2. dates_test.кв

test.py

class Get_People(BoxLayout):
    pass

class Get_Boys(BoxLayout):
    pass

class Get_Girls(BoxLayout):
    pass

class TestApp(App):
    def build(self):
        self.load_kv('dates_test.kv')
        return Get_People()

dates_test.файл кв

<Get_People>:
    orientation: 'vertical'
    Button:
        name: root_btn
        id: root_btn
        text: "I am Root Button"
        on_release: change_label_b
    Label:
        id: root_lbl
        text: "I am Root Label"
    Get_Boys:
    Get_Girls:

<Get_Boys>:
    Button:
        id: button_b
        text: "Button for boys"
        on_press: change_label_root
        on_release: change_label_g
    Label:
        id: label_b
        text: "Label for boys"

<Get_Girls>:
    Button:
        id: button_g
        text: "Button for girls"
    Label:
        id: label_g
        text:"Label for girls"

1 ответов


хорошо!, похоже, я сам нашел ответ, и я хотел бы поделиться им.

прежде всего давайте дадим " id " в dates_test.файл кв. Чтобы вы могли получить к ним доступ в коде python или in .файл кв.

<Get_People>:
    stuff_p: root_lbl
    ...
    Get_Boys:
        id: gb
    Get_Girls:
        id: gg

<Get_Boys>:
    stuff_b: label_b

<Get_Girls>:
    stuff_c: label_g

вы можете спросить, Что такое stuff_p, stuff_b и stuff_c???

они ObjectProperty определены в их собственных классах. Изменения, внесенные в stuff_b в коде python, вносят изменения в label_b, как вы связали в kivy файл.

class Get_People(BoxLayout):
    stuff_p = ObjectProperty(None)
    ...

class Get_Boys(BoxLayout):
    stuff_b = ObjectProperty(None)
    ...

class Get_Girls(BoxLayout):
    stuff_c = ObjectProperty(None)
    ...

для части 1 и части 2

  1. if button with id: button_b (Get_Boys class) выпущен, затем метка с id: label_g (класс Get_Girls) должен измениться.

  2. если нажата кнопка с id: button_b (класс Get_Boys), то метка с id: root_lbl (класс Get_People) должен измениться.

в классе Get_Boys (test.py) определите эти методы.

def change_girl(self):

    self.parent.ids.gg.stuff_c.text = "Boys changed Girls!"
    #self.stuff_b.text = "i changed myself!"

def change_people(self):
    self.parent.ids.root_lbl.text = "Boys changed people!"

давайте посмотрим, что здесь произошло...

себя.родитель.ids.gg.stuff_c.текст = " мальчики изменили девочек!"

  1. self.родитель ссылается на класс Get_Parent.
  2. .ids.gg ссылается на идентификатор, который мы создали выше для Get_Girls.
  3. .stuff_c используется для ссылки на label_g (выше) в классе Get_Girls.
  4. .текст используется для изменения текста в метке.

и в самом .киловольт файл

<Get_Boys>:
    stuff_b: label_b
    Button:
        id: button_b
        text: "button 1"
        on_release: root.change_girl()
        on_press: root. change_people()

Часть 3

  1. если кнопка с id: root_btn (Get_People class) выпущена, то метка с id: label_b (класс Get_Boys) должен измениться.

в классе Get_People (test.py) определите метод.

def rooted(self):
    self.ids.gb.stuff_b.text = "people changed boys!"

и в .файл кв

Button:
    id: root_btn
    text: "I am Root"
    on_release: root.rooted()