我正在学习KivyMD,我正在创建DropdownMenu,我想在我的CreateUserScreen中访问id = branch。我试图从屏幕类“ on_kv_post”方法访问标签ID,但没有成功。
我可以从“ MainApp”类访问标签ID,但不能从“ Screen”类访问标签ID。
这是我的Main.py
from kivymd.app import MDApp
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import StringProperty, ObjectProperty
from kivymd.uix.list import (OneLineIconListItem, MDList)
from kivymd.uix.menu import MDDropdownMenu, RightContent
from kivymd.theming import ThemableBehavior
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
Window.size = (300, 500)
class ItemDrawer(OneLineIconListItem):
icon = StringProperty()
target = StringProperty()
class DrawerList(ThemableBehavior, MDList):
def set_color_item(self, instance_item):
"""Called when tap on a menu 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
class ContentNavigationDrawer(BoxLayout):
pass
class LoginScreen(Screen):
pass
class MenuScreen(Screen):
pass
class MainScreen(Screen):
pass
class CreateUserScreen(Screen):
def on_kv_post(self, base_widget):
branch_field = self.ids.branch
weightdropdown_item = [{"viewclass": "MDMenuItem", "text": "0-5 kgs"},
{"viewclass": "MDMenuItem", "text": "5-10 kgs"},
{"viewclass": "MDMenuItem", "text": "10-15 kgs"},
{"viewclass": "MDMenuItem", "text": "15-20 kgs"}]
self.weightdropdown = MDDropdownMenu(caller=branch_field, position="bottom", ver_growth="up",
hor_growth="right", width_mult=4, max_height=250,
items=weightdropdown_item, callback=self.dropdown_callback)
def branch_drop(self):
self.weightdropdown.open()
def dropdown_callback(self, instance):
self.weightdropdown.dismiss()
class UploadScreen(Screen):
pass
sm = ScreenManager()
sm.add_widget(LoginScreen(name='login_screen'))
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(MainScreen(name='main'))
sm.add_widget(CreateUserScreen(name='create_user'))
sm.add_widget(UploadScreen(name='upload'))
class DemoApp(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_file("bakery_app.kv")
def build(self):
return self.screen
def on_start(self):
menu = {
"Create User": ["face-profile", "create_user"],
"Master Data": ["face-profile", "master_data"],
"Logout": ["logout", "logout"]
}
for k, v in menu.items():
self.screen.get_screen('menu').ids.content_drawer.ids.container.add_widget(
ItemDrawer(target=v[1], text=k,
icon=v[0],
on_release=self.open_screen)
)
def open_screen(self, item_drawer):
self.open_screen_name(item_drawer.target)
self.screen.get_screen('menu').ids.nav_drawer.set_state("close")
def open_screen_name(self, screen_name):
self.screen.get_screen('menu').ids.screen_manager.current = screen_name
def login(self):
url_ext = '/api/get_token'
self.login_check = False
username = self.screen.get_screen('login_screen').ids.username.text
password = self.screen.get_screen('login_screen').ids.password.text
# data = {"username": username, "password": password}
# raw_data = json.dumps(data)
# req = requests.get(self.url + url_ext, data=raw_data, headers={'Content-Type': 'application/json'})
# if req.status_code == 200 and req.json()['success']:
if username == 'admin' and password == '123456':
self.screen.get_screen('menu').manager.current = 'menu'
else:
# print(req.json()['message'])
print('Incorrect credentials')
DemoApp().run()
我的kv文件
<ItemDrawer>:
theme_text_color: "Custom"
on_release:
self.parent.set_color_item(self)
IconLeftWidget:
id: icon
icon: root.icon
theme_text_color: "Custom"
text_color: root.text_color
<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: "56dp", "56dp"
source: "data/logo/kivy-icon-256.png"
MDLabel:
text: "Navigate to Screen"
font_style: "Button"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
text: "KivyMD Nav Drawer and Screen Manager"
font_style: "Caption"
size_hint_y: None
height: self.texture_size[1]
ScrollView:
DrawerList:
id: container
ScreenManager:
LoginScreen:
MenuScreen:
<LoginScreen>
name: 'login_screen'
MDFloatLayout:
MDLabel:
text: 'Login'
pos_hint: {"center_y": .85}
font_style: "H4"
halign: "center"
theme_text_color: "Custom"
text_color: 0, 0, 0, 1
MDLabel:
text: 'Welcome to My App'
pos_hint: {"center_y": .75}
font_style: "H5"
halign: "center"
theme_text_color: "Custom"
text_color: 0, 0, 0, 1
MDTextField:
id: username
hint_text: "Username"
pos_hint: {"center_x": .5, "center_y": .6}
current_hint_text_color: 0, 0, 0, 1
size_hint_x: .8
helper_text:'Required'
helper_text_mode: 'on_error'
icon_right: 'account'
required: True
MDTextField:
id: password
hint_text: "Password"
pos_hint: {"center_x": .5, "center_y": .5}
password: True
current_hint_text_color: 0, 0, 0, 1
size_hint_x: .8
helper_text:'Required'
helper_text_mode: 'on_error'
icon_right: 'account'
required: True
MDRaisedButton:
text: "Login"
pos_hint: {"center_x": .5, "center_y": .4}
size_hint_x: .5
on_press:
app.login()
theme_text_color: "Custom"
text_color: 0, 0, 0, 1
<MenuScreen>:
name: 'menu'
Screen:
NavigationLayout:
ScreenManager:
Screen:
BoxLayout:
orientation: 'vertical'
MDToolbar:
title: 'Mhell App'
left_action_items: [["menu", lambda x: nav_drawer.set_state('toggle')]]
elevation: 10
Widget:
ScreenManager:
id: screen_manager
MainScreen:
CreateUserScreen:
UploadScreen:
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
id: content_drawer
<MainScreen>:
name: 'main'
MDLabel:
text: 'Main Screen'
halign: 'center'
<RightContentCls>
disabled: True
MDIconButton:
icon: root.icon
user_font_size: "16sp"
pos_hint: {"center_y": .5}
MDLabel:
text: root.text
font_style: "Caption"
size_hint_x: None
width: self.texture_size[0]
text_size: None, None
<CreateUserScreen>:
name: 'create_user'
MDLabel:
text: 'Create User'
halign: 'center'
pos_hint: {"center_y": .85}
font_style: 'H5'
size_hint_y: None
height: dp(36)
GridLayout:
cols: 1
padding: 20, 20
spacing: 5,5
size_hint: 1,0.87
MDTextField:
id: username
hint_text: "Username"
current_hint_text_color: 0, 0, 0, 1
size_hint_x: .8
helper_text:'Required'
helper_text_mode: 'on_error'
icon_right: 'account'
required: True
MDTextField:
id: password
hint_text: "Password"
current_hint_text_color: 0, 0, 0, 1
size_hint_x: .8
helper_text:'Required'
helper_text_mode: 'on_error'
icon_right: 'account'
required: True
MDTextField:
id: branch
hint_text: "Branch"
current_hint_text_color: 0, 0, 0, 1
size_hint_x: .8
helper_text:'Required'
helper_text_mode: 'on_error'
icon_right: 'account'
required: True
on_focus: root.branch_drop()
<UploadScreen>:
name: 'upload'
MDLabel:
text: 'Lets upload some files!'
halign: 'center'
MDRectangleFlatButton:
text: 'Back'
pos_hint: {'center_x': 0.5, 'center_y': 0.2}
on_press: root.manager.current = 'profile'