【问题标题】:Getting ids from the main.kv file KivyMD从 main.kv 文件 KivyMD 获取 id
【发布时间】:2020-07-19 11:51:25
【问题描述】:

这可能有一个简单的解决方案,但我无法弄清楚。参考以下代码

from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivymd.theming import ThemeManager
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivymd.uix.navigationdrawer import NavigationLayout, MDNavigationDrawer
from kivymd.uix.list import OneLineListItem, OneLineIconListItem
from kivymd.uix.list import MDList
from kivymd.uix.toolbar import MDToolbar

class HomeScreen(Screen):
    pass

class ContentDrawer(BoxLayout): 
    screen_manager = ObjectProperty() 
    nav_drawer = ObjectProperty()

class MainApp(MDApp):
    def __init__(self):
        self.GUI = Builder.load_file("main.kv")
        self.theme_cls = ThemeManager()

    def build(self):
        return self.GUI

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


ma​​in.kv

<ContentDrawer>:
    ScrollView:
        MDList:
            OneLineIconListItem: 
                text: "Screen 1" 
                icon: 'basketball-hoop'
                on_press: 
                    root.nav_drawer.set_state("close") 
                    root.screen_manager.current = "add_buy_condition_screen"

            OneLineIconListItem: 
                text: "Screen 2" 
                icon: 'basketball'
                on_press: 
                    root.nav_drawer.set_state("close") 
                    root.screen_manager.current = "add_sell_condition_screen"

NavigationLayout: 
    MDNavigationDrawer: 
        id: nav_drawer
    
        ContentDrawer: 
            screen_manager: screen_manager 
            nav_drawer: nav_drawer

    ScreenManager:
        HomeScreen:
            name: "home_screen"
            id: home_screen
            BoxLayout:
                orientation:"vertical"
                MDToolbar:
                    pos_hint:{"top": 1}
                    elevation:10
                    title:"Lleno"
                    left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]

所以我正在尝试创建一个工具栏,当我使用上面的代码创建它时,除了 MDNavigation 抽屉出现在工具栏下方之外,一切都可以正常工作。我想为 Homescreen 类中的工具栏创建框布局,如下所示。

class HomeScreen(Screen):
    
    def __init__(self, **kwargs):
        super(HomeScreen, self).__init__(**kwargs)
        print("My main app's ids: ", self.ids)
     
        self.nav_drawer = self.ids["nav_drawer"]

        self.header_box = BoxLayout(orientation="vertical")
        self.toolbar = MDToolbar(pos_hint={"top": 1}, elevation=10,
            title="Lleno", left_action_items= [["menu", lambda x: nav_drawer.set_state("open")]])

        self.header_box.add_widget(self.toolbar)   

        self.add_widget(self.header_box)

但是我似乎无法从我的 main.kv 文件中获取 self.nav_drawer id,我如何才能访问该 id 或者以 MDNavigation 抽屉打开时的方式创建工具栏的另一种方法工具栏位于其下方。 self.ids 的打印语句返回一个空字典

【问题讨论】:

    标签: python object kivy kivy-language kivymd


    【解决方案1】:

    来自kv 文件的ids 位于创建它们的规则的根目录中,因此nav_drawer id 位于NavigationLayout 的实例中,而不是HomeScreen 的实例中。此外,ids__init__() 方法中不可用,因为它们尚未创建。您可以使用Clock.schedule_once()on_kv_post() 方法延迟对ids 的访问。

    您可以使用类似的方式访问App 中的ids

    App.get_running_app().root.ids['nav_drawer']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      相关资源
      最近更新 更多