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

Posted

技术标签:

【中文标题】如何使用字典遍历我的 kivy 属性并对其进行更改?【英文标题】:How can I use a dictionary to iterate through my kivy properties and make changes to them? 【发布时间】:2018-08-18 05:21:55 【问题描述】:

对于我的 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]

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

编辑:

我注意到我创建了一个按钮状态实例,但没有在我的函数中与之通信。我将其更改为与 self.buttonstates 实例进行通信,但它并没有改变任何事情。

【问题讨论】:

什么是amount_of_buttons_to_change 我正在构建的项目是关于检测图片中的项目。所以我想检测图片中的项目,并根据应用程序找到多少项目激活按钮。最后,这将意味着按钮响应它们所代表的项目。编辑:我意识到您可能会问,因为我似乎没有使用该变量。我希望在 range() 函数中使用它:for no in range(amount_of_buttons_to_change): 【参考方案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,这样您就可以轻松添加/删除按钮并拥有一些合理的默认值。

【讨论】:

以上是关于如何使用字典遍历我的 kivy 属性并对其进行更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用nixos中设置的属性的默认值,并对其进行扩展

如何设置透明背景颜色并对 kivy 图像进行抗锯齿处理?

遍历各个像素点并对其进行修改

用Java实现一个树形结构,并对其进行遍历

Python 遍历指定文件目录的所有文件并对其进行转码

建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果