如何使用字典迭代我的kivy属性并对其进行更改?

时间:2018-03-09 15:33:44

标签: python button kivy

对于我的kivy项目,我试图在那里创建一个带有BooleanProperties的字典。我希望将此用于6个按钮,我希望启用和禁用它们。我尝试过这样做的方式(通常只使用3个属性):

class MainScreen(ScreenManager):
    disable_1 = BooleanProperty(True)
    disable_2 = BooleanProperty(True)
    disable_3 = BooleanProperty(True)
    buttonstates = []

按钮的.kv代码如下所示:

<MainScreen>:
    BoxLayout:
        id: box_buttons_1
        orientation: 'vertical'
        Button:
            background_color: (1.0, 0.0, 0.0, 1.0)
            text: "place 1"
            on_press: show_pictures_manager.get_children_of_screenmanager(1)
            disabled: root.disable_1
        Button:
            background_color: (0.8, 0.8, 0.0, 1.0)
            text: "place 1.1"
            disabled: root.disable_2
        Button:
            background_color: (1.0, 0.0, 1.0, 1.0)
            text: "place 1.2"
            disabled: root.disable_3

我想用来迭代它们并改变它们的值的函数是:

def change_button_states(self, amount_of_buttons_to_change):
    self.buttonstates = [self.disable_1, self.disable_2, self.disable_3]
    for no in range(3):
        self.buttonstates[1] = False
        print(self.buttonstates)

此代码打印3次:

[True, False, True]

一切都很好,但是(在这种情况下)第二个按钮没有启用它自己。我做错了什么?

编辑:

我注意到我创建了一个buttonstates实例,但在我的函数中没有与它通信。我改变它以与self.buttonstates实例进行通信,但它并没有改变一件事。

1 个答案:

答案 0 :(得分:1)

你可以通过各种方式做到这一点。

代码中的最小更改量只需使用getattr,setattr。

for no in range(3):
    setattr(self, 'disable_%s' % no, False)
    print(getattr(self, 'disabled_%s' % no)

但你仍然需要为每个按钮创建一个属性,这可能不够灵活。

使用ListProperty代替并在其索引处查找每个按钮以了解是否必须禁用它可能更好。

class MainScreen(ScreenManager):
    buttonstates = ListProperty([False, False, True])

<MainScreen>:
    BoxLayout:
        id: box_buttons_1
        orientation: 'vertical'
        Button:
            background_color: (1.0, 0.0, 0.0, 1.0)
            text: "place 1"
            on_press: show_pictures_manager.get_children_of_screenmanager(1)
            disabled: root.buttonstates[0]
        Button:
            background_color: (0.8, 0.8, 0.0, 1.0)
            text: "place 1.1"
            disabled: root.buttonstates[1]
        Button:
            background_color: (1.0, 0.0, 1.0, 1.0)
            text: "place 1.2"
            disabled: root.buttonstates[2]

然后你改变状态的功能又回到了

def change_button_states(self, amount_of_buttons_to_change):
    for no in range(3):
        self.buttonstates[no] = False
        print(self.buttonstates)

你也可以有一个DictProperty,每个按钮都有一个id,并让按钮在dict中查找它的id,这样你就可以轻松添加/删除按钮并拥有一些理智的默认值。