Saurabh Shrivastava
Saurabh Shrivastava

Reputation: 1484

Implement android back button function in Kivy

Firstly, i have gone thru many examples, but could not figure out this, so asking here. My app is to be run on android. Screen 1 have a button which will go to screen 2 on click. All i need is code to move back to screen 1 on pressing back button on screen 2

My code:

#!/usr/bin/kivy
import kivy
kivy.require('1.7.2')

from random import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from random import random
from random import choice
from kivy.properties import StringProperty
import time
from kivy.clock import Clock
from functools import partial
from kivy.utils import platform
from kivy.core.window import Window

Builder.load_string("""
<MenuScreen>:
    Button:
        text: "move to next screen 2"
        on_press: root.manager.current = 'game_mode'
<GameMode>:
    Label:
        text: "screen 2"
""")

class MenuScreen(Screen):
    pass

class GameMode(Screen):
    pass

sm = ScreenManager()
menu_screen = MenuScreen(name='menu')
sm.add_widget(menu_screen)
sm.add_widget(GameMode(name='game_mode'))

class TestApp(App):

    def build(self):
        self.bind(on_start=self.post_build_init)
        return sm

    def post_build_init(self,ev):
        if platform == 'android':
            import android
            android.map_key(android.KEYCODE_BACK, 1001)

        win = Window
        win.bind(on_keyboard=self.key_handler)

    def key_handler(self, window, keycode1, keycode2, text, modifiers):
        if keycode1 == 27 or keycode1 == 1001:
            sm.go_back()
            return True
        return False

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

Please help. I want solution based on screen manager. I would really appreciate if you can improve my code to provide solution.

Upvotes: 2

Views: 1306

Answers (2)

Saurabh Shrivastava
Saurabh Shrivastava

Reputation: 1484

Finally, figured it out

#!/usr/bin/kivy
import kivy
kivy.require('1.7.2')

from random import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from random import random
from random import choice
from kivy.properties import StringProperty
import time
from kivy.clock import Clock
from functools import partial
from kivy.core.window import Window

Builder.load_string("""
<MenuScreen>:
    Button:
        text: "move to next screen 2"
        on_press: root.manager.current = 'game_mode'
<GameMode>:
    Label:
        text: "screen 2"
""")

class MenuScreen(Screen):
    pass

class GameMode(Screen):
    pass

sm = ScreenManager()
menu_screen = MenuScreen(name='menu')
sm.add_widget(menu_screen)
sm.add_widget(GameMode(name='game_mode'))

class TestApp(App):

    def build(self):
        self.bind(on_start=self.post_build_init)
        return sm

    def post_build_init(self,ev):
        from kivy.base import EventLoop
        EventLoop.window.bind(on_keyboard=self.hook_keyboard)

    def hook_keyboard(self, window, key, *largs):
        if key == 27:

            print sm.current
            if(sm.current=='menu'):
                App.get_running_app().stop()
            sm.current='menu'
            return True 



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

Upvotes: 4

ODiogoSilva
ODiogoSilva

Reputation: 2414

ScreenManager has a previous() method that should solve your problem:

Builder.load_string("""
<MenuScreen>:
    Button:
        text: "move to next screen 2"
        on_press: root.manager.current = 'game_mode'
<GameMode>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "go back"
            on_press: root.manager.current = root.manager.previous()
        Label:
            text: "screen 2"
""")

Upvotes: 0

Related Questions