функциональность кнопки "назад" на android с kivy
В киви, когда я нажимаю кнопку "назад" на своем устройстве android, он выбрасывает меня из приложения. есть ли способ вернуться к предыдущему экрану, используя язык Kivy, а не python? вот что я написал на языке киви:--2-->
<MyAppClass>:
AnchorLayout:
anchor_x : 'center'
anchor_y : 'top'
ScreenManager:
size_hint : 1, .9
id: _screen_manager
Screen:
name:'screen1'
StackLayout:
# irrelevant code
Screen:
name:'screen2'
StackLayout:
# irrelevant code
Мне нужно манипулировать диспетчером экрана и его экранами из python... если я смогу это сделать, я буду в порядке с python.
3 ответов
Kivy на android привязывает кнопку Назад к esc
кнопка так привязка и прослушивание esc
кнопка в вашем приложении поможет вам справиться с тем, как ваше приложение ведет себя при нажатии кнопки "Назад".
другими словами, в вашем приложении при тестировании на рабочем столе слушайте клавишу escape с системной клавиатуры, это будет автоматически переведено на кнопку "назад" на вашем устройстве android. Что-то типа:
def on_start():
from kivy.base import EventLoop
EventLoop.window.bind(on_keyboard=self.hook_keyboard)
def hook_keyboard(self, window, key, *largs):
if key == 27:
# do what you want, return True for stopping the propagation
return True
Это, конечно, возможно. Вот краткий пример приложения с методом, который я использую для этого:
from kivy.utils import platform
from kivy.core.window import Window
class ExampleApp(App):
manager = ObjectProperty()
def build(self):
sm = MyScreenManager()
self.manager = sm
self.bind(on_start=self.post_build_init)
return sm
def post_build_init(self, *args):
if platform() == 'android':
import android
android.map_key(android.KEYCODE_BACK, 1001)
win = Window
win.bind(on_keyboard=self.my_key_handler)
def my_key_handler(self, window, keycode1, keycode2, text, modifiers):
if keycode1 in [27, 1001]:
self.manager.go_back()
return True
return False
это должно дать правильную основную идею, но несколько замечаний:
- ScreenManager не отслеживает предыдущие экраны, это до вас, чтобы реализовать это, как вам нравится. В моем примере предполагается, что вы определили класс MyScreenManager с помощью метода go_back.
- возможно, нет необходимости привязываться к on_start и запускать post_build_init, вот как пример, который я первоначально использовал, сделал это (см. ниже). Это может быть важно иногда, хотя, возможно, если окно не инициализируется, когда
build()
запускается, и исходная почта списка рассылки предполагает, что автору это было нужно по какой-то причине. - пример прослушивает коды ключей 27 или 1001. Как сказал КУА-нон, когда я писал это, первый слушает
esc
, Так что вы можете получить такое же поведение на рабочем столе. - Я не пытался без
android.map_key
line, но похоже, что это может и не надо. - вы упомянули, что хотите использовать язык киви, а не python. Вам нужно сделать некоторый python, чтобы получить этот результат, и я не вижу способа обойти это (на самом деле это не домен языка kv). Я думаю, вы могли бы перенести некоторые вещи в kv, определив событие "go_back" где-то и запустив это, когда клавиша нажата, наряду с привязкой вашего screenmanager для просмотра этого события, но это кажется длинным путем.
Я основал свой код на дискуссии в списке рассылки на https://groups.google.com/forum/#!тема/kivy-пользователи/7rOZGMMIFXI . Возможно, есть лучший способ, но он вполне функциональный.
Я думаю, что я решил это, но должен поблагодарить как @inclement и @qua-non! ваши ответы, ребята привели меня на правильный путь! поэтому в kv я предполагаю, что я дал идентификатор своему менеджеру экрана (см. мой вопрос, где я написал код kv), в python я должен сделать следующее:
from kivy.core.window import Window
from kivy.properties import ObjectProperty
class MyAppClass(FloatLayout):#its a FloatLayout in my case
_screen_manager=ObjectProperty(None)
def __init__(self,**kwargs):
super(MyAppClass,self).__init__(**kwargs)
#code goes here and add:
Window.bind(on_keyboard=self.Android_back_click)
def Android_back_click(self,window,key,*largs):
if key == 27:
self._scree_manager.current='screen1'#you can create a method here to cache in a list the number of screens and then pop the last visited screen.
return True
class MyApp(App):
def build(self):
return MyAppClass()
if __name__=='__main__':
MyApp().run()