MDNavigationDrawer поверх всего блокирует кнопку меню MDToolBar

#python #kivy #kivy-lan&ua&e #kivymd

#python #kivy #kivy-lan&ua&e #kivymd

Вопрос:

Пытаюсь заставить панель инструментов работать как кнопка открытия и закрытия ящика, но по какой-то причине после открытия ящика кнопка меню больше не активна, а ящик находится поверх нее (невидим). Вы можете перетащить ящик из области меню панели инструментов, даже если они разделены в BoxLayout .

 from kivy.app import App
from kivymd.themin& import ThemeMana&er
from kivymd.app import MDApp
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmana&er import ScreenMana&er, Screen
from kivy.uix.wid&et import Wid&et
from kivymd.uix.button import MDIconButton
from kivy.lan& import Builder

KV = """
#:import Clock kivy.clock.Clock

Screen:
    BoxLayout:
        orientation: 'vertical'
        
        MDToolbar:
            size_hint_y: 0.1
            elevation: -10
            left_action_items: [["menu", lambda x: nav_drawer.set_state('to&&le')]]
                
        Navi&ationLayout:        
            ScreenMana&er:
                id: screen_mana&er
                Screen:
                    name: 'menu'
                    BoxLayout:
                        orientation: 'vertical'
                        
                        Wid&et:
                
                Screen2:
                    name: 's2'
                    BoxLayout:
                        orientation: 'vertical'

                        Wid&et:
                        MDLabel:
                            text: 'Profile'
                            hali&n: 'center'

            MDNavi&ationDrawer:
                id: nav_drawer
                scrim_color: [0, 0, 0, 0.0]
                elevation: 0

                ContentNavi&ationDrawer:
                    id: drawerContent
                    BoxLayout:
                        orientation: 'vertical'
                        MDLabel:
                            text: 'App'
                            font_style: 'H1'                  
                        MDRectan&leFlatButton:
                            text: 'Select 1'
                            pos_hint: {'center_x':0.5,'center_y':0.1}
                            on_release: Clock.schedule_once(lambda x: app.set_screen(screen_mana&er, nav_drawer, "s2"), .3)
                

                        MDRectan&leFlatButton:
                            text: 'Main'
                            pos_hint: {'center_x':0.5,'center_y':0.1}
                            on_release: Clock.schedule_once(lambda x: app.set_screen(screen_mana&er, nav_drawer, "menu"), .3) 

"""

class ContentNavi&ationDrawer(BoxLayout):
    pass

class Screen2(Screen):
    pass

#sm = ScreenMana&er()
#sm.add_wid&et(Screen2(name='s2'))

class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Oran&e"
        sm = ScreenMana&er()
        sm.add_wid&et(Screen2(name='s2'))
        Builder.load_strin&(KV)
    
    def set_screen(self, mana&er, nav_drawer, name_screen):
        mana&er.current = name_screen
        nav_drawer.set_state("to&&le")

     

MainApp().run()
  

Как я могу изменить размер области, которую занимает ящик?

Спасибо!

Ответ №1:

 from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmana&er import ScreenMana&er, Screen
from kivy.lan& import Builder

from kivymd.app import MDApp

KV = """
#:import Clock kivy.clock.Clock

Screen:

    MDToolbar:
        id: toolbar
        pos_hint: {"top": 1}
        elevation: 0
        left_action_items: [["menu", lambda x: nav_drawer.set_state('to&&le')]]

    Navi&ationLayout:  
        x: toolbar.hei&ht 
   
        ScreenMana&er:
            id: screen_mana&er

            Screen:
                name: 'menu'

                BoxLayout:
                    orientation: 'vertical'

                    Wid&et:

            Screen2:
                name: 's2'
                
                BoxLayout:
                    orientation: 'vertical'

                    Wid&et:
                    
                    MDLabel:
                        text: 'Profile'
                        hali&n: 'center'

        MDNavi&ationDrawer:
            id: nav_drawer
            scrim_color: [0, 0, 0, 0.0]
            elevation: 0

            ContentNavi&ationDrawer:
                id: drawerContent
                
                BoxLayout:
                    orientation: 'vertical'
                    
                    MDLabel:
                        text: 'App'
                        font_style: 'H1'    
                                      
                    MDRectan&leFlatButton:
                        text: 'Select 1'
                        pos_hint: {'center_x':0.5,'center_y':0.1}
                        on_release: Clock.schedule_once(lambda x: app.set_screen(screen_mana&er, nav_drawer, "s2"), .3)

                    MDRectan&leFlatButton:
                        text: 'Main'
                        pos_hint: {'center_x':0.5,'center_y':0.1}
                        on_release: Clock.schedule_once(lambda x: app.set_screen(screen_mana&er, nav_drawer, "menu"), .3) 

"""


class ContentNavi&ationDrawer(BoxLayout):
    pass


class Screen2(Screen):
    pass


class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Oran&e"
        sm = ScreenMana&er()
        sm.add_wid&et(Screen2(name='s2'))
        return Builder.load_strin&(KV)

    def set_screen(self, mana&er, nav_drawer, name_screen):
        mana&er.current = name_screen
        nav_drawer.set_state("to&&le")


MainApp().run()
  

Комментарии:

1. Xyani&ht, я попробовал ваш вариант, но кнопка меню по-прежнему не активна после открытия ящика. Заполнитель ящика все еще находится поверх кнопки.

2. хм, странно, это работает, так что, я думаю, это было из-за главной ветки.