繁体   English   中英

如何在 kivymd 中使用底部工作表更改屏幕?

[英]How can I change screen using bottom sheet in kivymd?

我在 kivymd 中制作了一个简单的应用程序。 但是我无法通过单击 kivymd 中的按钮来更改屏幕。 一切都很好。 但是当我点击按钮时,它也会弹出吐司,但屏幕没有改变。 对此有何变化或更好的实施?

应用程序

from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from main_screen_str import helper_string
from kivy.core.window import Window
from kivymd.toast import toast
from kivymd.uix.bottomsheet import MDGridBottomSheet

Window.size = (300, 500)


class MainScreen(Screen):
    pass


class SettingsScreen(Screen):
    pass


class AboutScreen(Screen):
    pass


class MainApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.sm = ScreenManager()
        self.sm.add_widget(MainScreen(name="main_screen"))
        self.sm.add_widget(SettingsScreen(name="settings_screen"))
        self.sm.add_widget(AboutScreen(name="about_screen"))

        self.main_str = Builder.load_string(helper_string)

    def build(self):
        screen = Screen()
        screen.add_widget(self.main_str)
        return screen

    def callback_for_menu_items(self, *args):
        if args[0] == 'Home':
            toast(args[0])
            self.sm.current = "main_screen"

        if args[0] == 'Settings':
            toast(args[0])
            self.sm.current = "settings_screen"

        if args[0] == 'About':
            toast(args[0])
            self.sm.current = "about_screen"

    def show_example_grid_bottom_sheet(self):
        self.bottom_sheet_menu = MDGridBottomSheet()

        data = {
            "Home": "home",
            "Settings": "settings",
            "About": "information-outline",
        }
        for item in data.items():
            self.bottom_sheet_menu.add_item(
                item[0],
                lambda x, y=item[0]: self.callback_for_menu_items(y),
                icon_src=item[1],
            )
        self.bottom_sheet_menu.open()


if __name__ == '__main__':
    MainApp().run()

此构建器字符串用于创建屏幕。 有没有更好的解决方案?

生成器字符串

helper_string = """
ScreenManager:
    MainScreen:
    SettingsScreen:
    AboutScreen:

<MainScreen>:
    name: 'main_screen'

    MDIconButton:
        icon: "menu"
        theme_text_color: "Custom"
        text_color: 1,0,0,1
        on_press: app.show_example_grid_bottom_sheet()
  
<SettingsScreen>:
    name: 'settings_screen'
    
<AboutScreen>:
    name: 'about_screen'      
"""

App __init__()方法中,您正在使用以下行构建self.sm

    self.sm = ScreenManager()
    self.sm.add_widget(MainScreen(name="main_screen"))
    self.sm.add_widget(SettingsScreen(name="settings_screen"))
    self.sm.add_widget(AboutScreen(name="about_screen"))

但是self.sm不用作 GUI 的一部分。 因此,您对self.sm的更改对您的 GUI 没有影响。 以下行:

self.main_str = Builder.load_string(helper_string)

基本上与前几行完全相同。

然后在你的build()方法,您要创建一个新的Screen ,并加入self.main_str作为的子Screen

虽然您可以将ScreenManager作为Screen的子项,但在您发布的示例中似乎没有任何用途。

这是MainApp部分的修改版本,我认为它MainApp您的需求:

class MainApp(MDApp):
    # def __init__(self, **kwargs):
    #     super().__init__(**kwargs)
    #     self.sm = ScreenManager()
    #     self.sm.add_widget(MainScreen(name="main_screen"))
    #     self.sm.add_widget(SettingsScreen(name="settings_screen"))
    #     self.sm.add_widget(AboutScreen(name="about_screen"))
    #
    #     self.main_str = Builder.load_string(helper_string)

    def build(self):
        self.sm = Builder.load_string(helper_string)
        return self.sm
        # screen = Screen()
        # screen.add_widget(self.main_str)
        # return screen

上面的代码大大简化了build()方法,去掉了__init__()方法,现在self.sm实际上是 GUI 的一部分。

请注意,当您使用Builder.load_string()加载具有根节点的kv字符串时,将创建并返回该根节点。 您的kv字符串中的行:

ScreenManager:
    MainScreen:
    SettingsScreen:
    AboutScreen:

结果是创建了一个ScreenManager实例以及为其列出的三个子项,因此__init__()方法中的代码正在复制它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM