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

时间:2019-05-07 18:22:28

标签: python-3.x kivy kivy-language

我正在构建一个使用kivy和google photos api的照片查看应用程序。我在屏幕中使用自定义StackView来遍历相册,以为每个相册创建一个按钮。我正在使用自定义的AsyncImage ButtonBehavior类来简化按钮的源图像。我在尝试调用屏幕管理器的当前属性时遇到问题。我知道在kv文件中可以调用root,也可以在python中使用self.manager.current = ...我不确定如何从几个级别调用管理器。这是相关的代码。

如何从ImageButton的on_press或on release功能切换屏幕?


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 :(得分:0)

您只需在kvlang中引用应用小部件即可。

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

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

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

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