注意:底部工具栏 这基本上是屏幕

kivy Bottom Toolbar et multi screen

两件事: 1 - 我想知道这是否是实现我想要的目标的正确方法。切换屏幕时持久底部Appbar

2 - 我不知道如何删除底部 AppBar 顶部的额外填充。 (bottomAppBar 和按钮之间的白色 space,见下文)

main.py

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_file("multi.kv")


class MainWindow(Screen):
    pass


# Declare both screens
class MenuScreen(Screen):
    pass


class SettingsScreen(Screen):
    pass


class TestApp(MDApp):

    def build(self):
        # Create the screen manager
        sm = ScreenManager()
        sm.add_widget(MenuScreen(name='menu'))
        sm.add_widget(SettingsScreen(name='settings'))

        return sm


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

multi.kv

<MDBottomAppBar>:
    MDToolbar:
        title: "test"
        left_action_items : [["menu", lambda x: print("menu pressed")]]
        right_action_items : [["dots-vertical", lambda x: print("dots print")]]
        icon: 'account'
        icon_color : [1,0,0]

<MenuScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            Button:
                text: 'Goto settings'
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'settings'
            Button:
                text: 'Quit'
        MDBottomAppBar

<SettingsScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            Button:
                text: 'My settings button'
            Button:
                text: 'Back to menu'
                on_press:
                    root.manager.transition.direction = 'right'
                    root.manager.current = 'menu'
        MDBottomAppBar

谢谢

您可以通过不将其包含在 Screens 中来获得持久性 AppBar。您可以通过将 MainWindow 添加到 kv:

来获得包含 ScreenManagerMDBottomAppBarMainWindow
<MDBottomAppBar>:
    MDToolbar:
        title: "test"
        left_action_items : [["menu", lambda x: print("menu pressed")]]
        right_action_items : [["dots-vertical", lambda x: print("dots print")]]
        icon: 'account'
        icon_color : [1,0,0,1]

<MenuScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            Button:
                text: 'Goto settings'
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'settings'
            Button:
                text: 'Quit'
        # MDBottomAppBar

<SettingsScreen>:
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            Button:
                text: 'My settings button'
            Button:
                text: 'Back to menu'
                on_press:
                    root.manager.transition.direction = 'right'
                    root.manager.current = 'menu'
        # MDBottomAppBar
        
<MainWindow>:
    ScreenManager:
        size_hint_y: None
        height: root.height - appbar.height
        y: appbar.top
        MenuScreen:
            name: 'menu'
        SettingsScreen:
            name: 'settings'
    MDBottomAppBar:
        id: appbar

现在 build() 方法只是 returns MainWindow():

class TestApp(MDApp):

    def build(self):
        return MainWindow()