gpt4 book ai didi

python - 基维 : how to get widget by id (without kv)

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:10 24 4
gpt4 key购买 nike

假设我在 Kivy 中动态定义了一些小部件(按钮)并动态分配它们的 ID。在这个用例中我没有使用 kv 语言。我可以在不跟踪小部件本身的情况下保留小部件 ID 的引用:然后我想通过它的 id 访问小部件。我可以做类似“通过 id 获取小部件”的操作吗?(如果我在 kv 文件中定义了小部件,我可以使用 self.ids.the_widget_id 通过其 id 访问小部件本身)

最佳答案

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() 方法在 Kivy 1.8.1 版本中添加到 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()

关于python - 基维 : how to get widget by id (without kv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24781248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com