Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable a widget in Kivy?

I read the Kivy tutorial and couldn't find how to disable a widget (for example, a Button).

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

I bind foo with functools.partial.

What is the correct parameter?

like image 412
Ulrich Von Rekkenin Avatar asked Nov 07 '13 17:11

Ulrich Von Rekkenin


People also ask

How do I disable Kivy button?

If you are using kivy version >= 1.8 then you can just do widget. disabled = True. If on previous versions you can simply manage the disabling yourself, just make sure it doesn't react to touch and displays a alternative look when disabled.

What is Pos_hint in Kivy?

You can only use values between 0-1 for both size_hint and pos_hint. Where 0 = 0% and 1 = 100%. The coordinate system in kivy works from the bottom left! This will be important when placing our objects.


3 Answers

If you are using kivy version >= 1.8 then you can just do widget.disabled = True. If on previous versions you can simply manage the disabling yourself, just make sure it doesn't react to touch and displays a alternative look when disabled.

like image 62
qua-non Avatar answered Oct 22 '22 13:10

qua-non


  1. It's disabled, not disable
  2. Set it to True

Example:

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()
like image 31
Nykakin Avatar answered Oct 22 '22 13:10

Nykakin


In the following example MyButton follows @qua-non idea. It uses a BooleanProperty to change the background_color and color of it. More important, it adds a condition if self.enabled: in the on_touch_down. If there is no on_touch_down, then there is no on_touch_move, on_touch_up, on_press or on_release. Therefore, we can consider the Button disabled.

I use the name enabled instead of disabled to avoid possible future problems with by using the same attribute of 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()
like image 21
toto_tico Avatar answered Oct 22 '22 13:10

toto_tico