Киви: Панель навигации на всех экранах

#python #python-3.x #kivy #kivy-language

Вопрос:

Я хочу сохранить панель навигации на всем своем экране, я могу переключать экран и отображать то, что хочу, но, похоже, я не сохраняю панель навигации.

Также по какой-то причине мое боковое меню, кажется, появляется дважды, перекрывая друг друга, и я не уверен, почему, я попытался провести рефакторинг кода, и он, кажется, появляется снова

Может ли кто-нибудь предложить какую-либо помощь?

*.py

 import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.core.window import Window
from kivymd.app import MDApp
from kivymd.uix.card import MDCard
from kivymd.uix.label import MDLabel

class FirstWindow(Screen):
    pass

class ThirdWindow(Screen):

    def on_pre_enter(self):
        anchor = AnchorLayout(size=(1,1))
        test = "This is the new window"
        card = MDCard(orientation='vertical',padding="8dp",size_hint=(1,0.5),pos_hint={'top': 0.1,'right':1},radius=[5, ])
        card.test = test
        card.add_widget(MDLabel(text=test, halign="center"))
        anchor.add_widget(card)
        self.anchorID.add_widget(anchor)
            

class WindowManager(ScreenManager):
    pass

class NearMeApp(MDApp):
    def build(self):
        self.theme_cls.theme_style ="Dark"
        self.theme_cls.accent_palette = "Red"
        self.theme_cls.primary_palette = "Purple"
        self.root = Builder.load_file('NearMe.kv')

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

*.кв

 #:import hex kivy.utils.get_color_from_hex
#:kivy 1.10.1
WindowManager:
    FirstWindow:
    ThirdWindow:
<FirstWindow>:
    name:"FirstWindow"
    Screen:
        MDNavigationLayout:
            ScreenManager:
                Screen:
                    BoxLayout:
                        orientation: 'vertical'
                        MDToolbar:
                            title: "NearMe Application"
                            elevation: 10
                            left_action_items: [['menu', lambda x: nav_drawer.set_state("open")]]
                        Widget:
            MDNavigationDrawer:
                id: nav_drawer
                BoxLayout:
                    orientation:'vertical'
                Button:
                    text:"ThirdWindow"
                    on_release: root.manager.current = "ThirdWindow"
<ThirdWindow>:
    name:"ThirdWindow"      
    anchorID:anchorID

    AnchorLayout:
        id:anchorID
        canvas.before:
            Color:
                rgba: .2, .2, .2, 1
            Rectangle:
                pos: self.pos
                size: self.size
 

Ответ №1:

Ваша панель инструментов md должна находиться над главным оконным менеджером.

Если ваш mdtoolbar является дочерним элементом firstwindow (дочерним элементом windowmanager), ваш windowmanager одновременно воздействует на него и на другие дочерние элементы firstwindow во время изменения текущего окна. Если переместить панель mdtool из первого окна и выше windowmanager, панель mdtool останется на месте.

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


class FirstWindow(Screen):
    pass


class ThirdWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


kv = """
Screen:
    MDNavigationDrawer:
        id: nav_drawer
        BoxLayout:
            orientation:'vertical'
            Button:
                text:"ThirdWindow"
                on_release: root.ids.manager.current = "ThirdWindow"
    StackLayout:
        MDToolbar:
            title: "NearMe Application"
            size_hint: (1, 0.1)
            elevation: 10
            left_action_items: [['menu', lambda x: nav_drawer.set_state("open")]]
        WindowManager:
            id: manager
            FirstWindow:
            ThirdWindow:

<FirstWindow>:
    name:"FirstWindow"
    Screen:
        BoxLayout:
            orientation: 'vertical'
            Widget:
<ThirdWindow>:
    name:"ThirdWindow"      
    anchorID:anchorID

    AnchorLayout:
        id:anchorID
        canvas.before:
            Color:
                rgba: .2, .2, .2, 1
            Rectangle:
                pos: self.pos
                size: self.size
"""


class Test(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.screen = Builder.load_string(kv)

    def build(self):
        return self.screen


the_app = Test()
the_app.run()
 

Вышесказанное удаляет панель инструментов из вашего первого окна и помещает ее отдельно. В вашем примере панель инструментов является дочерним элементом FirstWindow, поэтому, когда вы меняете текущее окно (экран) на третье окно, панель инструментов исчезает вместе со своим родителем (первым окном). Теперь панель инструментов не является дочерним элементом ни одного из окон.

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

1. Не могли бы вы показать мне простой пример, если у вас есть время, я был бы признателен!

2. Я обновил свой ответ.