在Kivy中实现android后退按钮功能

在Kivy中实现android后退按钮功能,kivy,Kivy,首先,我看了很多例子,但不能理解这一点,所以在这里提问。 我的应用程序将在android上运行。屏幕1有一个按钮,单击该按钮将转到屏幕2。 我所需要的只是在按下屏幕2上的后退按钮时返回到屏幕1的代码 我的代码: #!/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.ui

首先,我看了很多例子,但不能理解这一点,所以在这里提问。 我的应用程序将在android上运行。屏幕1有一个按钮,单击该按钮将转到屏幕2。 我所需要的只是在按下屏幕2上的后退按钮时返回到屏幕1的代码

我的代码:

#!/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()
#/usr/bin/kivy
进口克维
kivy.require('1.7.2')
从随机导入随机
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.button导入按钮
从kivy.uix.label导入标签
从kivy.uix.popup导入弹出窗口
从随机导入随机
从随机进口选择
从kivy.properties导入StringProperty
导入时间
从kivy.clock导入时钟
从functools导入部分
来自kivy.utils导入平台
从kivy.core.window导入窗口
生成器。加载\u字符串(“”)
:
按钮:
文本:“移动到下一屏幕2”
按:root.manager.current='game\u mode'
:
标签:
文本:“屏幕2”
""")
类菜单屏幕(屏幕):
通过
类游戏模式(屏幕):
通过
sm=屏幕管理器()
菜单屏幕=菜单屏幕(name='menu')
sm.添加小部件(菜单屏幕)
sm.add_小部件(GameMode(name='game_mode'))
类TestApp(应用程序):
def生成(自):
self.bind(on_start=self.post_build_init)
返回sm
def后期构建初始(自我,ev):
如果平台==“android”:
导入android
android.map_key(android.KEYCODE_BACK,1001)
win=窗口
win.bind(在键盘上=self.key\u处理程序)
def key_处理程序(自身、窗口、keycode1、keycode2、文本、修改器):
如果keycode1==27或keycode1==1001:
山猫回去
返回真值
返回错误
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()
请帮忙。我想要基于屏幕管理器的解决方案。如果您能改进我的代码以提供解决方案,我将不胜感激。

ScreenManager有一种方法可以解决您的问题:

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"
""")
Builder.load\u字符串(“”)
:
按钮:
文本:“移动到下一屏幕2”
按:root.manager.current='game\u mode'
:
盒子布局:
方向:“垂直”
按钮:
文本:“返回”
按:root.manager.current=root.manager.previous()
标签:
文本:“屏幕2”
""")

最后,我终于明白了

#!/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()
#/usr/bin/kivy
进口克维
kivy.require('1.7.2')
从随机导入随机
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.button导入按钮
从kivy.uix.label导入标签
从kivy.uix.popup导入弹出窗口
从随机导入随机
从随机进口选择
从kivy.properties导入StringProperty
导入时间
从kivy.clock导入时钟
从functools导入部分
从kivy.core.window导入窗口
生成器。加载\u字符串(“”)
:
按钮:
文本:“移动到下一屏幕2”
按:root.manager.current='game\u mode'
:
标签:
文本:“屏幕2”
""")
类菜单屏幕(屏幕):
通过
类游戏模式(屏幕):
通过
sm=屏幕管理器()
菜单屏幕=菜单屏幕(name='menu')
sm.添加小部件(菜单屏幕)
sm.add_小部件(GameMode(name='game_mode'))
类TestApp(应用程序):
def生成(自):
self.bind(on_start=self.post_build_init)
返回sm
def后期构建初始(自我,ev):
从kivy.base导入EventLoop
EventLoop.window.bind(在键盘=self.hook键盘上)
def hook_键盘(自身、窗口、键、*largs):
如果键==27:
打印sm.current
如果(sm.current=='menu'):
App.get_running_App().stop()
sm.当前菜单'
返回真值
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
TestApp().run()

我有这样做的代码,虽然pygame的东西不是必需的(而且你可能应该避免它,因为我们预计很快就会离开android上的pygame)。很快离开android上的pygame?这意味着什么-你是说kivy不应该被用来实现android游戏吗?不,这意味着你不应该直接调用pygame(例如,
import pygame
)。Kivy自己的API将保持不变,并一如既往地工作-默认情况下,我们使用pygame作为一些后端内容,因此目前可以直接导入它,但我们不保证它的存在,您应该避免这样做。我已经更新了我的代码,在windows键盘上按ESC键时仍然出现错误。屏幕管理器没有属性管理器。我在屏幕2中没有按钮。假设我从android启动了我的应用程序。Android有一个默认的后退按钮。当前它将退出应用程序。我需要安卓后退按钮功能。