从自定义布局中的自定义按钮调用屏幕管理器



我正在构建一个使用Kivy和Google Photos API的照片查看应用程序。我在屏幕中使用自定义堆栈视图通过专辑迭代,为每张专辑创建一个按钮。我正在使用自定义的异步图,即ButtonBehavior类来简化按钮的源图像。我正在尝试调用屏幕管理器的当前属性的问题。我知道可以在一个可以调用root的kV文件中,或者从python中使用self.manager.current = ...我不确定如何从几个级别下调用经理。这是相关代码。

我如何从ImageButton的on_press或发行功能切换屏幕?


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

您可以简单地参考kvlang中的应用窗口小部件。

假设您的WindowManager是根小部件,即。

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

您可以在.kv文件中直接切换屏幕(并指定过渡方向(:

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

最新更新