Search code examples
pythonpython-2.7kivy-language

Python : How to remove focus from button when click anywhere on window


I am using python-2.7 and kivy .When i run test.py then i set focus on button.After that i click anywhere on window using mouse then focus does not remove . Because after click on window i press enter then it call def self.add().
Can someone tell me how to remove focus from button when click anywhere on
window ?

test.py

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty, ObjectProperty
from kivy.clock import Clock

Window.clearcolor = (0.5, 0.5, 0.5, 1)
Window.size = (500, 150)


class User(Screen):
    name = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        Window.bind(on_key_down=self._on_keyboard_down)
        Clock.schedule_once(self.name_focus, 1)

    def name_focus(self, *args):
        self.postUser.focus = True
        self.postUser.background_color = [0.5, 0.5, 0.5, 1]


    def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
        if (hasattr(self.postUser, 'focus') and self.postUser.focus) and keycode == 40:
            self.add()

    def add(self):
        print('button Event Call')


class Test(App):

    def build(self):
        return self.root


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

test.kv

#:kivy 1.10.0

User:
    name: name
    postUser : postUser
    BoxLayout:
        orientation: "vertical"
        GridLayout:
            cols: 2
            padding: 20, 20
            spacing: 10, 10

            Label:
                text: "Name"
                text_size: self.size
                valign: 'middle'
            TextInput:
                id:name
                text_size: self.size
        GridLayout:
            cols: 2
            padding: 0, 0
            spacing: 5, 0
            size_hint: .5, .35
            pos_hint: {'x': .25, 'y': 0}

            Button:
                id:postUser
                size_hint_x: .5
                text: "Ok"
                focus: False
                on_release:
                    root.add()

Solution

  • You can add on_touch_up method in your User class.

    def on_touch_up(self, touch):
        if (hasattr(self.postUser, 'focus') and self.postUser.focus):
            self.postUser.focus = False
            self.postUser.background_color = [1, 1, 1, 1]
    

    I am posting complete code.

    test.py

    from kivy.uix.screenmanager import Screen
    from kivy.app import App
    from kivy.core.window import Window
    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import StringProperty, ObjectProperty
    from kivy.clock import Clock
    
    Window.clearcolor = (0.5, 0.5, 0.5, 1)
    Window.size = (500, 150)
    
    
    class User(Screen):
        name = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(User, self).__init__(**kwargs)
            Window.bind(on_key_down=self._on_keyboard_down)
            Clock.schedule_once(self.name_focus, 1)
    
        def name_focus(self, *args):
            self.postUser.focus = True
            self.postUser.background_color = [0.5, 0.5, 0.5, 1]
    
    
        def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
            if (hasattr(self.postUser, 'focus') and self.postUser.focus) and keycode == 40:
                self.add()
    
        def add(self):
            print('button Event Call')
    
        def on_touch_up(self, touch):
            if (hasattr(self.postUser, 'focus') and self.postUser.focus):
                self.postUser.focus = False
                self.postUser.background_color = [1, 1, 1, 1]
    
    
    class Test(App):
    
        def build(self):
            return self.root
    
    
    if __name__ == '__main__':
        Test().run()
    

    test.kv

    #:kivy 1.10.0
    
    User:
        name: name
        postUser : postUser
        BoxLayout:
            orientation: "vertical"
            GridLayout:
                cols: 2
                padding: 20, 20
                spacing: 10, 10
    
                Label:
                    text: "Name"
                    text_size: self.size
                    valign: 'middle'
                TextInput:
                    id:name
                    text_size: self.size
            GridLayout:
                cols: 2
                padding: 0, 0
                spacing: 5, 0
                size_hint: .5, .35
                pos_hint: {'x': .25, 'y': 0}
    
                Button:
                    id:postUser
                    size_hint_x: .5
                    text: "Ok"
                    focus: False
                    on_release:
                        root.add()