【问题标题】:Calling screen manager from custom button within custom layout从自定义布局中的自定义按钮调用屏幕管理器
【发布时间】:2019-09-25 11:07:05
【问题描述】:

我正在构建一个使用 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')

【问题讨论】:

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


    【解决方案1】:

    你可以简单地参考kvlang中的app widget。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多