我如何根据 Kivy 中另一个小部件的值禁用一个小部件

how do i disable a widget based on the value of another widget in Kivy

我在 .kv 文件中有一个 Spinner 小部件,我需要这个 Spinner 的值来启用另一个 Spinner 小部件。

这是我试过的代码,它不起作用并给我一个语法错误:

CustLabel:
    text: "Aux LO Pump Status"


CustSpinner:
    id: auxlo
    text: "Select"
    values: ('On', 'Off')
    focus: True
    on_state: (self.auxlonum.disabled) if (self.auxlo == 'off')

CustLabel:
    text: "Aux LO Pump Number"

CustSpinner:
    id: auxlonum
    text: "Select"
    values: ('# 1', '# 2')
    focus: True

我实际上更喜欢 auxlonum 小部件从禁用开始,然后 'greyed out' 然后只有在 auxlo 小部件选择了 'on' 时才启用,但是我不确定如何去做。

谢谢。

首先,您不能使用 on_state 事件,因为它会在您选择一个值之前发出。您需要改用 on_text 事件。

另一方面,self.auxlonum 是一个不正确的语法,您应该只使用 id 来引用 kv 中的任何小部件。

最后,你只需要使用三元运算符语法就可以做你想做的事情了:

Spinner:
    id: auxlo
    on_text: auxlonum.disabled = True if auxlo.text == 'Off' else False

或:

Spinner:
    id: auxlonum
    disabled: True if auxlo.text == 'Off' else False

可执行示例:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

from kivy.lang import Builder


Builder.load_string('''
<MyWidget>
    orientation: 'vertical'
    Spinner:
        id: auxlo
        text: "Select"
        values: ('On', 'Off')
        focus: True
        on_text: auxlonum.disabled = True if auxlo.text == 'Off' else False

    Label:

    Spinner:
        id: auxlonum
        text: "Select"
        values: ('# 1', '# 2')
        focus: True

    Label:
''')


class MyWidget(BoxLayout):
    pass

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

TestApp().run()