python - KivyMd 屏幕不变
问题描述
我有这个 python 文件
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.theming import ThemableBehavior, ThemeManager
from kivymd.uix.list import OneLineIconListItem, MDList
class ContentNavigationDrawer(BoxLayout):
pass
class ItemDrawer(OneLineIconListItem):
icon = StringProperty()
class MainApp(MDApp):
def on_start(self):
icons_item = {
'bug': 'Files'
}
for icon_name in icons_item.keys():
self.root.ids.content_drawer.ids.md_list.add_widget(
ItemDrawer(icon=icon_name, text=icons_item[icon_name])
)
class DrawerList(ThemableBehavior, MDList):
def set_color_item(self, instance_item):
# Set the color of the icon and text for the menu item.
for item in self.children:
if item.text_color == self.theme_cls.primary_color:
item.text_color = self.theme_cls.text_color
break
instance_item.text_color = self.theme_cls.primary_color
MainApp().run()
而这个 .kv 文件见第 3 行,错误是没有定义 screen_manager
<ItemDrawer>:
theme_text_color: "Custom"
on_release: screen_manager.current = 'screen2'
IconLeftWidget:
id: icon
icon: root.icon
theme_text_color: "Custom"
text_color: 0,0,0,1
<ContentNavigationDrawer>:
orientation: "vertical"
padding: "8dp"
spacing: "8dp"
AnchorLayout:
anchor_x: "left"
size_hint_y: None
height: avatar.height
Image:
id: avatar
size_hint: None, None
size: "250", "250"
source: "logo.jpg"
ScrollView:
DrawerList:
id: md_list
NavigationLayout:
ScreenManager:
id: screen_manager
Screen:
name: 'screen1'
BoxLayout:
orientation: 'vertical'
Widget:
canvas:
Color:
rgba: 0,1,0.2117647058823529,0.3
Rectangle:
size: self.size
pos: self.pos
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
id: content_drawer
Screen:
name: 'screen2'
当我单击导航抽屉中的项目时,它说screen_manager 未定义
我究竟做错了什么?我在互联网上搜索了很多,但找不到任何有用的东西
请帮助我,我如何更换屏幕?
解决方案
MDNavigation Drawer 应该与 ScreenManager 处于相同的缩进级别。此外,
MDNavigationLayout:
screen_manager:screen_manager
ScreenManager:
id: screen_manager
Screen:
name: 'screen1'
BoxLayout:
orientation: 'vertical'
MDToolbar:
title: "Navigation Drawer"
elevation: 10
left_action_items: [['menu', lambda x:nav_drawer.set_state("open")]]
Widget:
Screen:
name: 'screen2'
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
id: content_drawer
添加
screen_manager:screen_manager
在 NavigationLayout 下方,以便它可以作为ObjectProperty访问。最后将 ItemDrawer 回调从
on_release: screen_manager.current = 'screen2'
至
on_release: app.root.screen_manager.current = 'screen2'
最后你还可以添加
nav_drawer: nav_drawer
在您的根窗口下方,并且位于该行的顶部/下方screen_manager: screen_manager
这可以在弹出新屏幕时关闭导航抽屉。
然后将您的回调更新为此:
on_release:
app.root.screen_manager.current = 'screen2'
app.root.nav_drawer.set_state('close')
推荐阅读
- flutter - 参数类型“对象?” 不能分配给参数类型“Widget?”
- macos - 有没有办法在 Appstore 上上传 Intel 和 M1 两者结合在一起?
- github-pages - 无法将 API 文档发布到 GitHub Pages
- swift - 为什么两个不同的串行队列会在 swift 中造成死锁?
- c# - 我应该如何在这两个实现中实现我的 Parcel 详细信息接口?
- database - 如何将报告的评论/照片存储在 Firestore 中?
- c# - 将文件下载到文件夹而不是下载文件夹.net core
- arrays - 使用 Magento 1.9.4.x / PHP 致命错误从 PHP 5.6 升级到 PHP 7.3:无法在第 152 行使用字符串偏移作为数组 StocksController.php
- c++ - 在 cpp 中使用 mexCallMATLAB
- c++ - 从派生指针访问基类成员