对于我的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实例进行通信,但它并没有改变一件事。
答案 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,这样你就可以轻松添加/删除按钮并拥有一些理智的默认值。