假设我在Kivy中动态定义了几个小部件(按钮)并动态分配了他们的id。 我在这个用例中没有使用kv语言。 我可以保留一个小部件ID的引用而不跟踪小部件本身:然后我想通过它的id访问小部件。 我可以做一些像“按ID获取小部件”的内容吗? (如果我在kv文件中定义了小部件,我可以使用self.ids.the_widget_id通过其id访问小部件本身)
答案 0 :(得分:2)
Kivy小部件制作树形结构。任何小部件的子代都可以通过children
属性获得。如果需要,您可以仅保留对根窗口的引用,然后使用walk
方法迭代它的小部件:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class MyWidget(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
button = Button(text="...", id="1")
button.bind(on_release=self.print_label)
l1 = BoxLayout(id="2")
l2 = BoxLayout(id="3")
self.add_widget(l1)
l1.add_widget(l2)
l2.add_widget(button)
def print_label(self, *args):
for widget in self.walk():
print("{} -> {}".format(widget, widget.id))
class MyApp(App):
def build(self):
return MyWidget()
if __name__ == '__main__':
MyApp().run()
walk()
和walk_reverse()
方法已添加到1.8版Kivy中的kivy.uix.widget.Widget
。对于旧版本,您需要自己以递归方式解析树:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class MyWidget(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
button = Button(text="...", id="1")
button.bind(on_release=self.print_label)
l1 = BoxLayout(id="2")
l2 = BoxLayout(id="3")
self.add_widget(l1)
l1.add_widget(l2)
l2.add_widget(button)
def print_label(self, *args):
children = self.children[:]
while children:
child = children.pop()
print("{} -> {}".format(child, child.id))
children.extend(child.children)
class MyApp(App):
def build(self):
return MyWidget()
if __name__ == '__main__':
MyApp().run()
答案 1 :(得分:1)
您可以直接使用ID检索小部件。例如,在您的代码中,您可以使用以下代码段修改Button文本:
self.ids.2.ids.3.ids.1.text = '!!!!'
答案 2 :(得分:0)
您可以使用ID更改每个小部件的属性:
self.ids['order_number'].text='S1212'