Вызов менеджера экрана из пользовательской кнопки в пользовательском макете - PullRequest
0 голосов
/ 07 мая 2019

Я создаю приложение для просмотра фотографий, в котором используются API-интерфейсы kivy и google photos.Я использую собственный StackView на экране, чтобы перебирать альбомы, чтобы создать кнопку для каждого альбома.Я использую пользовательский класс AsyncImage, ButtonBehavior, чтобы упростить исходное изображение кнопки.У меня проблемы с попыткой вызвать текущее свойство диспетчера экрана.Я знаю, что в файле kv я могу вызвать root, или из python я могу использовать self.manager.current = ... Я не знаю, как выполнить вызов менеджера с нескольких уровней вниз.Вот соответствующий код.

Как переключить экраны с функции on_press или включения релиза ImageButton?


class AlbumScreen(Screen):
    pass

class WindowManager(ScreenManager):

    def switch_screen(self, screen):
        self.current = screen

class AlbumStack(StackLayout):
    def __init__(self, **kwargs):
        super(AlbumStack, self).__init__(**kwargs)
        creds = get_credentials()
        svc = build_service(creds)
        albums = get_albums(svc)
        self.orientation = 'lr-tb'
        self.spacing = 2
        self.padding = 4
        params = '=w200-h200-c'
        try:
            for album in albums:
                url = parametrize_url(album['coverPhotoBaseUrl'], params)
                btn = ImageButton(source=url,size=(100,100), size_hint=(None,None))
                self.add_widget(btn)
        except Exception as e:
            print(str(e))


class ImageButton(AsyncImage, ButtonBehavior):
    pass

и соответствующей части моего файла kv

<WindowManager>:
    LoginScreen:
    AlbumScreen:
    PictureSelectorScreen:
    PictureViewerScreen:

<AlbumScreen>:
    name: 'AlbumScreen'
    AlbumStack:

РЕДАКТИРОВАТЬ:

Я смог заставить это работать, добавив переопределение пользовательских кнопок on_release:

class ImageButton(ButtonBehavior, AsyncImage):

    def on_release(self):
        app = App.get_running_app()
        app.root.switch_screen('PictureViewerScreen')

1 Ответ

0 голосов
/ 10 мая 2019

Вы можете просто обратиться к виджету приложения в kvlang.

Предполагая, что WindowManager является корневым виджетом, то есть

class MyApp(App):
    def build(self):
        return WindowManager()

вы можете напрямую переключать экраны (и указывать направление перехода)внутри .kv файла:

....
    ImageButton:
        on_release: 
            app.root.current = 'PictureViewerScreen'
            app.root.transition.direction = 'right'
....
...