首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从main.kv文件KivyMD获取ids

从main.kv文件KivyMD获取ids
EN

Stack Overflow用户
提问于 2020-07-19 11:51:25
回答 1查看 1.6K关注 0票数 0

这可能有一个简单的解决方案,但我看不出来。以下列代码为参考

代码语言:javascript
复制
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()

main.kv

代码语言:javascript
复制
<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抽屉出现在工具栏下面之外,每个工具条都工作得很好。我想在主屏幕类中为工具栏创建框布局,如下所示。

代码语言:javascript
复制
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)

但是,我似乎无法从我的self.nav_drawer文件中获得该main.kv id,如何访问该id,或者当MDNavigation抽屉打开工具栏时,如何以另一种方式创建工具栏。self.ids的print语句返回一个空的dict

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-19 13:24:20

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

您可以使用以下内容访问ids在您的App

代码语言:javascript
复制
App.get_running_app().root.ids['nav_drawer']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62979893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档