在KV文件中更改Kivy类属性

时间:2018-12-21 19:17:40

标签: python kivy

我想更改多个位置的切换按钮的属性。运行代码时,我得到AttributeError: 'super' object has no attribute '__getattr__'。我必须在python文件中创建按钮才能正常工作吗?

from kivy.app import App
from kivy.lang import Builder

KV = Builder.load_string("""

ScreenManager:
    Screen:
        name: 'screen'
        GridLayout:
            cols:1
            rows:3

            TButton:
            TButton:

            Button:
                text:
                    'Reset button'
                on_release:
                    app.root.get_screen('screen').ids.toggle_buttons.state = 'normal'

<TButton@ToggleButton>:
    id: toggle_buttons
    allow_no_selection: True
    text: 'Toggle Button'

""")

class MyApp(App):
    def build(self):
        return KV

if __name__ == '__main__':
    MyApp().run()

当我按下“重置按钮”时,TButton应该将其state重置为'normal'

1 个答案:

答案 0 :(得分:1)

首先,您必须了解id必须具有本地范围,并且不应在其外部使用它。因此,toggle_buttons ID仅应在TButton的实现中使用。

根据您的逻辑,假设您只想通过该ID重置一个按钮,如果它们具有相同的ID,如何识别该按钮?我们认为这是不可能的。

解决方案是实现一个属性,该属性存储按钮的ID并通过设置该属性进行迭代。

ScreenManager:
    buttons: [btn1, btn2] # <---
    Screen:
        name: 'screen'
        GridLayout:
            cols:1
            rows:3
            TButton:
                id: btn1
            TButton:
                id: btn2
            Button:
                text:
                    'Reset button'
                on_release: for btn in root.buttons: btn.state = 'normal'

<TButton@ToggleButton>:
    id: toggle_buttons
    allow_no_selection: True
    text: 'Toggle Button'