android - KivyMD NavigationDrawerIconButtons 未出现
问题描述
新手在这里,如果我尝试的想法有点不正常,我深表歉意。
所以,我正在尝试使用 KivyMD 制作一个应用程序,我已经过了可以解锁应用程序然后进入包含导航抽屉的屏幕的部分。但是,因为(与此处为 NavigationDrawer 应用程序给出的示例不同,https://github.com/HeaTTheatR/KivyMD/wiki/Components-Navigation-Drawer其中 NavigationDrawer 是 MDApp 类的实际根)我的应用程序以“解锁”开头" 屏幕,只有在解锁后,才会出现包含 NavigationDrawer 和主屏幕(用于应用程序内容)的屏幕。我的问题是我不能(或者很可能:我不知道如何)在 NavigationDrawer 下添加选项列表。下面是我的实际代码,我很难弄清楚将这部分放在哪里,以便它在 NavigationDrawer 时工作
def on_start(self):
for items in {
"home-circle-outline": "Home",
"update": "Check for Update",
"settings-outline": "Settings",
"exit-to-app": "Exit",
}.items():
self.root.ids.content_drawer.ids.box_item.add_widget(
NavigationItem(
text=items[1],
icon=items[0],
)
)
所以,我在另一个屏幕(不是根)上有 NavigationDrawer,看来我必须对这部分进行一些修改:
`self.root.ids.content_drawer.ids.box_item.add_widget(
NavigationItem(
text=items[1],
icon=items[0],
)
)`
如果我的应用程序的 .py 代码是下面的代码,我应该把上面提到的代码块放在哪里(用于在 NavigationDrawer 中添加可点击选项的代码块)?
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemeManager
from kivy.uix.screenmanager import Screen, ScreenManager, FloatLayout
from kivymd.uix.list import ILeftBody, OneLineAvatarListItem
from kivymd.toast import toast
from kivy.uix.image import Image
loginscreen_kv = '''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#:import Factory kivy.factory.Factory
LoginScreen:
scr_mngr: scr_mngr
ScreenManager:
id: scr_mngr
screen1: screen1
transition: FadeTransition()
orientation: 'vertical'
canvas:
Rectangle:
source: "deku_blur30.png"
size: self.size
pos: self.pos
Screen:
id: screen1
name: 'screen1'
username: username
password: password
MDCard:
size_hint: None, None
size: dp(520), dp(340)
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
BoxLayout:
orientation:'vertical'
padding: dp(20)
spacing:20
MDLabel:
markup: True
text: '[b]Creator Login Credentials[/b] \\n [i]...so you can use the app[/i]'
theme_text_color: 'Primary'
size_hint_y: None
height: dp(36)
MDSeparator:
height: dp(5)
MDTextField:
id: username
hint_text: "Username "
helper_text_mode: "on_focus"
MDTextField:
id: password
hint_text: "Password "
helper_text_mode: "on_focus"
password: True
MDFlatButton:
text: "Unlock the App"
pos_hint: {'center_x': 0.5}
on_release: root.check_data_login()
MainAppScr:
<MainAppScr>:
name: 'main_app_scr'
ScreenManager:
id: screen_manager1
Screen:
name: 'screen1'
NavigationLayout:
ScreenManager:
id: screen_manager2
transition: FadeTransition()
Screen:
FloatLayout:
orientation: 'vertical'
canvas:
Rectangle:
source: "./dualface.jpeg"
size: self.size
pos: self.pos
MDToolbar:
title: "HeroAca"
background_color: app.theme_cls.primary_dark
pos_hint: {"top": 1}
elevation: 10
left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]
MDNavigationDrawer:
id: nav_drawer
# find auto-dismiss function
auto_dismiss: True
ContentNavigationDrawer:
id: content_drawer
# insert NavigationDrawerIconButtons here
<Page2@Screen>:
name: "screen2"
FloatLayout:
size_hint: 0.98, 0.95
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
canvas:
Rectangle:
#source: "./deku.jpg"
size: self.size
pos: self.pos
###
<NavigationItem>:
theme_text_color: 'Custom'
divider: None
IconLeftWidget:
icon: root.icon
<ContentNavigationDrawer>:
BoxLayout:
orientation: 'vertical'
FloatLayout:
size_hint_y: None
height: "200dp"
canvas:
Color:
rgba: app.theme_cls.primary_color
Rectangle:
#source: './deku.jpg'
pos: self.pos
size: self.size
# this is for the logo area of the drawer (inside the FloatLayout)
BoxLayout:
id: top_box
size_hint_y: None
height: "360dp"
padding: "10dp"
x: root.parent.x
pos_hint: {"top": 1}
Image:
# line below is for reference of how the original example mapped the kivymd logo
source: f"{images_path}kivymd_alpha.png"
#source: "./deku_transp.png"
MDIconButton:
icon: "close"
x: root.parent.x + dp(10)
pos_hint: {"top": 1}
on_release: root.parent.toggle_nav_drawer()
MDLabel:
markup: True
text: "[b]Teppy's Test App[/b]\\nVersion: 0.1"
pos_hint: {'center_y': .5}
pos_hint: {'top': .75}
x: root.parent.x + dp(10)
y: root.height - top_box.height + dp(10)
size_hint_y: None
height: self.texture_size[1]
ScrollView:
pos_hint: {"top": 1}
GridLayout:
id: box_item
cols: 1
size_hint_y: None
height: self.minimum_height
'''
class MainAppScr(Screen):
pass
class ContentNavigationDrawer(BoxLayout):
pass
class NavigationItem(OneLineAvatarListItem):
icon = StringProperty()
class LoginScreen(FloatLayout):
scr_mngr = ObjectProperty(None)
def check_data_login(self):
username = self.scr_mngr.screen1.username.text
password = self.scr_mngr.screen1.password.text
print(username)
print(password)
if username == "" and password == "": # set a username and pw to unlock the app
self.change_screen("main_app_scr")
def change_screen(self, screen, *args):
self.scr_mngr.current = screen
class MyHeroAcademia(MDApp):
title = "MyHeroAcademia App"
def __init__(self, **kwargs):
self.theme_cls.primary_palette = "Teal"
self.theme_cls.primary_accent = "BlueGray"
super().__init__(**kwargs)
def build(self):
return Builder.load_string(loginscreen_kv)
# find a way to get this to the nav drawer
"""
def on_start(self):
for items in {
"home-circle-outline": "Home",
"update": "Check for Update",
"settings-outline": "Settings",
"exit-to-app": "Exit",
}.items():
self.root.ids.content_drawer.ids.box_item.add_widget(
NavigationItem(
text=items[1],
icon=items[0],
)
)
"""
if __name__ =="__main__":
MyHeroAcademia().run()
一般来说,我想让 NavigationDrawer(我的代码上的“MainAppScr”)屏幕像文档中的示例一样工作。非常感谢所有帮助!
解决方案
推荐阅读
- node.js - Bcryptjs比较方法总是返回false?
- python - 在 matplotlib 轴上格式化日期时间以获得小时和分钟的问题
- python - 如何让 cppyy 找到其他标题?
- python - 你可以为函数论证做一个 if 语句吗?
- auto-keras - 为什么我的 AutoKeras ImageClassifier 的输入为空?
- flutter - 在 Dart/Flutter 中将 Uint16List 转换为字符串或整数
- javascript - 如何在 iframe 上方添加透明层?
- javascript - 如何使用 JS 提取 HTML 表格并将其保存为 Json?
- node.js - 如何在 reactJS + axios + nodeJS 中呈现 API 错误响应?
- python - 试图以 HTML 格式显示所有记录,但它仅在 HTML 中显示数据库中的最后一项