如何从kivy文件(.kv)访问不同类的id /小部件? [英] How to access id/widget of different class from a kivy file (.kv)?
问题描述
我想知道什么?
- 如果带有id:button_b(Get_Boys类)的按钮被释放,那么带有id:label_g(Get_Girls类)的标签必须更改。
- 如果按下带有id:button_b(Get_Boys类)的按钮,那么带有id:root_lbl(Get_People类)的Label必须更改
- 如果发布了带有id:root_btn(Get_People类)的按钮,那么带有id:label_b(Get_Boys类)的Label必须更改。
在这个链接,但不是从初学者的角度。
我有2个文件
<
.py
class Get_People(BoxLayout):
pre>
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()
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部分
如果带有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 =男孩改变了女孩!
- self .parent是指Get_Parent类。
- .ids.gg是指我们上面为Get_Girls创建的id。
- .stuff_c用于引用
- .text用于更改标签中的文本。
和.kv文件
< Get_Boys> ;:
stuff_b:label_b
按钮:
id:button_b
文本:按钮1
on_release:root.change_girl()
on_press:root。 change_people()
对于第3部分
- 如果带有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?
- If button with id: button_b (Get_Boys class) is released, then Label with id: label_g (Get_Girls class) must change.
- If Button with id: button_b (Get_Boys class) is pressed, then Label with id: root_lbl (Get_People class) must change.
- 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
- test.py
- 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
If button with id: button_b (Get_Boys class) is released, then Label with id: label_g (Get_Girls class) must change.
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!"
- self.parent refers to Get_Parent class.
- .ids.gg refers to the id that we created above for Get_Girls.
- .stuff_c is used to refer label_g (above) in Get_Girls class.
- .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
- 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屋!