web-dev-qa-db-ja.com

kivyファイル(.kv)から異なるクラスのID /ウィジェットにアクセスする方法は?

知りたいこと

  1. Id:button_b(Get_Boysクラス)​​のボタンがリリースされた場合、id:label_g(Get_Girlsクラス)​​のラベルを変更する必要があります。
  2. Id:button_b(Get_Boysクラス)​​のボタンが押された場合、id:root_lbl(Get_Peopleクラス)のラベルを変更する必要があります。
  3. Id:root_btn(Get_Peopleクラス)のButtonがリリースされた場合、id:label_b(Get_Boysクラス)​​のラベルを変更する必要があります。

this リンクで(少し)説明されていますが、初心者の観点からは説明されていません。

私は2つのファイルを持っています

  1. test.py
  2. days_test.kv

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()

days_test.kvファイル

<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"
12
kiok46

さて、私自身が答えを見つけたようです。それを共有したいと思います。

まず、dates_test.kvファイルに「id」を指定しましょう。 pythonコードまたは.kvファイルでそれらにアクセスできるようにします。

<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です。 pythonコードのstuff_bで行った変更は、kivyファイルでリンクしたようにlabel_bで変更を加えます。

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. Id:button_b(Get_Boysクラス)​​のボタンがリリースされた場合、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!"

ここで何が起こったのか見てみましょう...

self.parent.ids.gg.stuff_c.text = "男の子は女の子を変えました!"

  1. self.parentはGet_Parentクラスを参照します。
  2. .ids.ggは、Get_Girls用に上記で作成したIDを指します。
  3. .stuff_cは、Get_Girlsクラスのlabel_g(上記)を参照するために使用されます。
  4. .textは、ラベルのテキストを変更するために使用されます。

および.kvファイル内

<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クラス)のButtonがリリースされた場合、id:label_b(Get_Boysクラス)​​のラベルを変更する必要があります。

get_Peopleクラス(test.py)でメソッドを定義します。

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

および.kvファイル内

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