2015-05-11 55 views
1

首先,我已經通過很多例子,但無法弄清楚這一點,所以在這裏問。 我的應用程序將在android上運行。屏幕1有一個按鈕,點擊屏幕2。 所有我需要的是代碼上按後退按鈕在屏幕上2在基維實現android後退按鈕功能

我的代碼移回畫面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() 

請幫助。我想要基於屏幕管理器的解決方案。如果您能改進我的代碼以提供解決方案,我將非常感激。

+0

我有代碼,這是否[這裏](https://github.com /inclement/phutball/blob/master/main.py#L30),儘管pygame的東西並不是必需的(你也許應該避免它,因爲我們期望從android上的pygame很快離開)。 – inclement

+0

很快就會離開android上的pygame嗎?這意味着什麼 - 你的意思是不應該使用kivy來實現Android遊戲? –

+0

不,這意味着你不應該直接調用pygame(例如'import pygame')。 Kivy自己的API將會保持不變,並像以往一樣工作 - 默認情況下我們使用pygame作爲後端的東西,所以目前可以直接導入它,但我們不保證它的存在,您應該避免這樣做。 – inclement

回答

0

的ScreenManager有previous()方法應該解決您的問題:

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" 
""") 
+0

我沒有在屏幕2中的按鈕。假設我從android啓動了我的應用程序。 Android有一個默認的後退按鈕。目前它退出應用程序。我需要android後退按鈕功能。 –

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()