如何从kivy文件(.kv)访问不同类的id /小部件? [英] How to access id/widget of different class from a kivy file (.kv)?

查看:212
本文介绍了如何从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类)的Label必须更改

  3. 如果发布了带有id:root_btn(Get_People类)的按钮,那么带有id:label_b(Get_Boys类)的Label必须更改。

这个链接,但不是从初学者的角度。



我有2个文件



<
  • test.py

  • dates_test.kv

  • .py

      class Get_People(BoxLayout):
    pass

    class Get_Boys(BoxLayout) :
    pass

    class Get_Girls(BoxLayout):
    pass

    class Tes tApp(App):
    def build(self):
    self.load_kv('dates_test.kv')
    返回Get_People()
    pre>

    dates_test.kv文件

     < Get_People> ;: 
    orientation:'vertical'
    按钮:
    名称:root_btn
    id:root_btn
    文本:我是根按钮
    on_release:change_label_b
    标签:
    id:root_lbl
    文本:我是根标签
    Get_Boys:
    Get_Girls:

    < Get_Boys> ;:
    按钮:
    id:button_b
    文本:男孩的按钮
    on_press:change_label_root
    on_release:change_label_g
    标签:
    id:label_b
    文本:男孩标签

    < Get_Girls> ;:
    按钮:
    id:button_g
    文本:女孩按钮
    标签:
    id:label_g
    文本:女孩标签


    解决方案

    嗯,看来我自己找到了答案,我想分享一下。



    首先让我们在dates_test.kv文件中给出id。所以你可以使用python代码或.kv文件访问它们。

       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中发生更改。

     类Get_People(BoxLayout )
    stuff_p = ObjectProperty(无)
    ...

    类Get_Boys(BoxLayout):
    stuff_b = ObjectProperty(无)
    ...

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

    对于第1部分和第2部分



    1. 如果带有id:button_b(Get_Boys类)的按钮被释放,那么带有id:label_g(Get_Girls类)的Label
      必须更改。



    $ p

    在Get_Boys类(test.py)中定义这些方法。

     code> def change_girl(self):

    self.parent.ids.gg.stuff_ c.text =男孩改变了女孩!
    #self.stuff_b.text =我改变了自己!

    def change_people(self):
    self.parent.ids.root_lbl.text =男孩改变了人!

    让我们看看这里发生了什么...



    self.parent.ids.gg.stuff_c.text =男孩改变了女孩!


    1. self .parent是指Get_Parent类。

    2. .ids.gg是指我们上面为Get_Girls创建的id。

    3. .stuff_c用于引用

    4. .text用于更改标签中的文本。

    和.kv文件

     < Get_Boys> ;: 
    stuff_b:label_b
    按钮:
    id:button_b
    文本:按钮1
    on_release:root.change_girl()
    on_press:root。 change_people()

    对于第3部分



    1. 如果带有id:root_btn(Get_People类)的按钮被释放,那么Label
      的id为:label_b GetBeople类(test.py)中定义了一个方法。GetBeople类(test.py)中的

        def rooted(self):
      self.ids.gb.stuff_b.text =人们改变了男孩!

      和.kv文件

       按钮:
      id:root_btn
      文本:我是根
      on_release:root.rooted()


      What I want to know?

      1. If button with id: button_b (Get_Boys class) is released, then Label with id: label_g (Get_Girls class) must change.
      2. If Button with id: button_b (Get_Boys class) is pressed, then Label with id: root_lbl (Get_People class) must change.
      3. If Button with id: root_btn (Get_People class) is released, then Label with id: label_b (Get_Boys class) must change.

      It is explained (little) in this link, but not from the beginner's point of view.

      I have 2 files

      1. test.py
      2. dates_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()
      

      dates_test.kv file

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

      解决方案

      Well!, looks like I myself found the answer and I would like to share it.

      First of all let us give "id" in dates_test.kv file. So that you can access them in python code or in .kv file.

      <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
      

      you might wonder what is stuff_p,stuff_b and stuff_c???

      They are ObjectProperty defined in their own classes. The changes you make in stuff_b in your python code makes changes in label_b as you have linked in kivy file.

      class Get_People(BoxLayout):
          stuff_p = ObjectProperty(None)
          ...
      
      class Get_Boys(BoxLayout):
          stuff_b = ObjectProperty(None)
          ...
      
      class Get_Girls(BoxLayout):
          stuff_c = ObjectProperty(None)
          ...
      

      For Part 1 and Part 2

      1. If button with id: button_b (Get_Boys class) is released, then Label with id: label_g (Get_Girls class) must change.

      2. If Button with id: button_b (Get_Boys class) is pressed, then Label with id: root_lbl (Get_People class) must change.

      In the Get_Boys class (test.py) define these methods.

      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!"
      

      let's see what happened here...

      self.parent.ids.gg.stuff_c.text = "Boys changed Girls!"

      1. self.parent refers to Get_Parent class.
      2. .ids.gg refers to the id that we created above for Get_Girls.
      3. .stuff_c is used to refer label_g (above) in Get_Girls class.
      4. .text is used to change the text in the label.

      and in the .kv file

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

      For Part 3

      1. If Button with id: root_btn (Get_People class) is released, then Label with id: label_b (Get_Boys class) must change.

      in the Get_People class (test.py) define a method.

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

      and in .kv file

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

      这篇关于如何从kivy文件(.kv)访问不同类的id /小部件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆