从 main.kv 文件中获取 ID KivyMD
Getting ids from the main.kv file KivyMD
这可能有一个简单的解决方案,但我看不出来。参考以下代码
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
<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 抽屉出现在工具栏下方之外,一切正常。我想为主屏幕内的工具栏创建框布局 class,类似这样。
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 returns 空字典的打印语句
来自 kv
文件的 ids
位于创建它们的规则的根目录中,因此 nav_drawer
id
位于 [=15] 的实例中=],而不是 HomeScreen
。此外,ids
在 __init__()
方法中不可用,因为它们尚未创建。您可以使用 Clock.schedule_once()
或 on_kv_post()
方法延迟对 ids
的访问。
您可以使用
之类的方式访问 App
中的 ids
App.get_running_app().root.ids['nav_drawer']
这可能有一个简单的解决方案,但我看不出来。参考以下代码
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
<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 抽屉出现在工具栏下方之外,一切正常。我想为主屏幕内的工具栏创建框布局 class,类似这样。
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 returns 空字典的打印语句
来自 kv
文件的 ids
位于创建它们的规则的根目录中,因此 nav_drawer
id
位于 [=15] 的实例中=],而不是 HomeScreen
。此外,ids
在 __init__()
方法中不可用,因为它们尚未创建。您可以使用 Clock.schedule_once()
或 on_kv_post()
方法延迟对 ids
的访问。
您可以使用
之类的方式访问App
中的 ids
App.get_running_app().root.ids['nav_drawer']