由add_widget创建后如何访问小部件?

时间:2019-05-15 16:23:55

标签: python-3.x kivy

当我使用add_widget并尝试使用ids来访问它时,出现键错误。

def create_rss(self, *args):
    for rss in "food", "wood", "stone", "iron", "gold":
        self.ids["res"].add_widget(ToggleButton(id=rss, text=rss))
        self.ids["res"].ids[rss].state = "down"

我希望能够更改切换按钮的状态,因为在使用add_widget创建切换按钮之前已经完成了切换按钮。

当尝试打印切换按钮的父级时,我什么也没得到。因此,也许add_widget不能使切换按钮成为“ res”的子代?

1 个答案:

答案 0 :(得分:1)

问题

  

如何访问for循环外的按钮?

解决方案

有两种解决方法。

方法1-创建自己的ID字典

此方法涉及创建我们自己的ids字典类型属性。这种方法的优点是随机访问和顺序访问。

摘要

from kivy.properties import DictProperty
...
class class-name(...):
    my_ids = DictProperty({})

    def create_rss(self, *args):
        for rss in "food", "wood", "stone", "iron", "gold":
            toggle_button = ToggleButton(id=rss, text=rss)
            self.my_ids[rss] = toggle_button
            self.ids["res"].add_widget(toggle_button)
            toggle_button.state = "down"

    def access_using_my_ids(self):
        print(f"\nsequential access:")
        for key, value in self.my_ids.items():
            print(f"key={key}, value={value}, text={value.text}")

        print(f"\nrandom access:")
        print(f"object={self.my_ids['stone']}, text={self.my_ids['stone'].text}")

方法2-Kivy小部件树

此方法使用Kivy小部件树和for循环访问子级。这种方法的缺点是只能顺序访问。

摘要

    for child in reversed(self.ids.res.children):
        if isinstance(child, ToggleButton):
            print(f"ToggleButton.text={child.text}")

Kivy ID-用Python脚本创建

用Python脚本创建的基维ids未存储在self.ids字典类型属性中。因此,尝试访问它时会出错。

解决方案

将其分配给变量。

摘要

def create_rss(self, *args):
    for rss in "food", "wood", "stone", "iron", "gold":
        toggle_button = ToggleButton(id=rss, text=rss)
        self.ids["res"].add_widget(toggle_button)
        toggle_button.state = "down"