Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在通过add_widget创建之后访问widget?_Python 3.x_Kivy - Fatal编程技术网

Python 3.x 如何在通过add_widget创建之后访问widget?

Python 3.x 如何在通过add_widget创建之后访问widget?,python-3.x,kivy,Python 3.x,Kivy,当我使用add_小部件并尝试使用id访问它时,我得到一个关键错误 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_小部件并尝试使用id访问它时,我得到一个关键错误

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,它不会使切换按钮成为res的子对象?

问题
如何访问for循环外侧的按钮

解决方案 解决方案有两种方法

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

片段

方法2-Kivy小部件树 此方法使用Kivy小部件树和for循环来访问子级。这种方法的缺点是只进行顺序存取

片段

Kivy ID-用Python脚本创建 在Python脚本中创建的Kivy ID不存储在self.ids字典类型属性中。因此,在尝试访问它时会出现错误

解决方案 将其分配给一个变量

片段
如何访问for循环外侧的按钮?有关访问for循环外侧的切换按钮的解决方案,请参阅更新的帖子。
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}")
    for child in reversed(self.ids.res.children):
        if isinstance(child, ToggleButton):
            print(f"ToggleButton.text={child.text}")
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"