如何在Kivy中禁用小部件?

时间:2013-11-07 17:19:32

标签: python user-interface widget kivy

我阅读了Kivy教程,但无法找到如何禁用小部件(例如,按钮)。

def foo(self, instance, *args):
  #... main business logic, and then
  instance.disable = False
  # type(instance) = kivy.uix.Button

我将foofunctools.partial绑定。

正确的参数是什么?

3 个答案:

答案 0 :(得分:14)

如果您使用的是kivy版本> = 1.8,那么您可以执行widget.disabled = True。如果在之前的版本中您可以自行管理禁用,只需确保它不会对触摸作出反应并在禁用时显示另一种外观。

答案 1 :(得分:11)

  1. 它是disabled,而不是disable
  2. 将其设为True
  3. 示例:

    from kivy.uix.button import Button
    from kivy.app import App
    from functools import partial
    
    class ButtonTestApp(App):
        def foo(self, instance, *args):
            instance.disabled = True
    
        def build(self):
            btn = Button()
            btn.bind(on_press=partial(self.foo, btn));
            return btn
    
    if __name__ == '__main__':
        ButtonTestApp().run()
    

答案 2 :(得分:5)

在以下示例中,MyButton跟随@ qua-non idea。它使用BooleanProperty来更改background_colorcolor。更重要的是,它在if self.enabled:中添加了条件on_touch_down。如果没有on_touch_down,则表示没有on_touch_moveon_touch_upon_presson_release。因此,我们可以考虑禁用Button

我使用名称enabled代替disabled,以避免将来可能使用Kivy 1.8.0的相同属性。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import BooleanProperty
from kivy.uix.button import Button
from kivy.lang import Builder

Builder.load_string("""
<Example>:
    cols: 3
    Button:
        text: "Disable right button"
        on_press: my_button.enabled = False
    Button:
        text: "enabled right button"
        on_press: my_button.enabled = True
    MyButton:
        id: my_button
        text: "My button"
        on_press: print "It is enabled"
""")

class MyButton(Button):
    enabled = BooleanProperty(True)

    def on_enabled(self, instance, value):
        if value:
            self.background_color = [1,1,1,1]
            self.color = [1,1,1,1]
        else:
            self.background_color = [1,1,1,.3]
            self.color = [1,1,1,.5]

    def on_touch_down( self, touch ):
        if self.enabled:
            return super(self.__class__, self).on_touch_down(touch)

class Example(GridLayout):    
    pass

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

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