2015-05-11 2 views
1

Во-первых, я прошел множество примеров, но не мог понять это, поэтому прошу здесь. Мое приложение должно быть запущено на Android. На экране 1 есть кнопка, которая перейдет на экран 2 при нажатии. Все, что я нужен код, чтобы вернуться к экрану 1 по нажатию кнопки назад на экране 2Реализовать функцию кнопки обратной связи Android в Kivy

Мой код:

#!/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). – inclement

+0

скоро отойти от pygame на Android. что это означает - вы имеете в виду, что киви не должны использоваться для реализации игр для Android? –

+0

Нет, это означает, что вы не должны напрямую вызвать pygame (например, 'import pygame'). Собственный API Kivy будет неизменным и работать так, как он есть всегда - мы используем 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() 
Смежные вопросы