簡體   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