Python (Kivy) - 从 python 中的 .kv 检查复选框的值

Python (Kivy) - Check Value of Checkbox from .kv in python

我的 .kv 文件中有一个复选框,我想在未选中该复选框时禁用与其关联的文本输入。

我的.py代码

if self.ids.checkbox.active==False:
    self.ids.input.disabled==True
else:
    self.ids.input.disabled==False

我的 .kv 代码

TextInput:
        id: input
        text: "2fbd3320a168d5c2e35"
        pos_hint: {"x":0.1, "y":0.4}
        size_hint: 0.5,0.05
        background_disabled_normal: ""

    CheckBox:
        id: checkbox
        pos_hint: {"x":0.6, "y":0.4}
        size_hint: 0.05,0.05

我不知道该怎么做,.py 代码必须在函数中,但复选框不包含 on_release 属性。

您需要将事件(checkbox.active)关联到相应的回调。您可以在 .py 文件中使用 bind:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

kv_text = """\
<MyWidget>
    TextInput:
        id: input
        text: "2fbd3320a168d5c2e35"
        pos_hint: {"x":0.1, "y":0.4}
        size_hint: 0.5,0.05
        background_disabled_normal: ""
        disabled: True

    CheckBox:
        id: checkbox
        pos_hint: {"x":0.6, "y":0.4}
        size_hint: 0.05,0.05
"""

class MyWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        self.ids.checkbox.bind(active=self.disable_input)

    def disable_input(self, checkbox, checked):
        self.ids.input.disabled = not checked


class MyWidgetApp(App):
    def build(self):
        return MyWidget()

def main():
    Builder.load_string(kv_text)
    app = MyWidgetApp()
    app.run()

if __name__ == '__main__':
    main()

另一种选择是在 .kv 文件中进行:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

kv_text = """\
<MyWidget>
    TextInput:
        id: input
        text: "2fbd3320a168d5c2e35"
        pos_hint: {"x":0.1, "y":0.4}
        size_hint: 0.5,0.05
        background_disabled_normal: ""
        disabled: not checkbox.active      # <<<<<<<<<

    CheckBox:
        id: checkbox
        pos_hint: {"x":0.6, "y":0.4}
        size_hint: 0.05,0.05
"""

class MyWidget(FloatLayout):
    pass


class MyWidgetApp(App):
    def build(self):
        return MyWidget()

def main():
    Builder.load_string(kv_text)
    app = MyWidgetApp()
    app.run()

if __name__ == '__main__':
    main()