Python 3.x KivyMD-从Screen类访问ID

Python 3.x KivyMD-从Screen类访问ID,python-3.x,kivymd,Python 3.x,Kivymd,我正在学习KivyMD,正在创建下拉菜单,我想访问CreateUserScreen中的id=分支。我试图从screen类“on_kv_post”方法访问标签id,但没有成功 我可以从“MainApp”类访问标签id,但无法从“Screen”类访问它 这是我的主要任务 from kivymd.app import MDApp from kivy.clock import Clock from kivy.lang import Builder from kivy.properties import

我正在学习KivyMD,正在创建下拉菜单,我想访问CreateUserScreen中的id=分支。我试图从screen类“on_kv_post”方法访问标签id,但没有成功

我可以从“MainApp”类访问标签id,但无法从“Screen”类访问它

这是我的主要任务

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'
:
主题\文本\颜色:“自定义”
发布时:
self.parent.set\u color\u项目(self)
IconLeftWidget:
id:图标
图标:root.icon
主题\文本\颜色:“自定义”
文本颜色:root.text\u颜色
:
方向:“垂直”
填充:“8dp”
间距:“8dp”
主持人安排:
锚x:“左”
尺寸提示:无
高度:化身高度
图片:
id:avatar
大小提示:无,无
尺寸:“56dp”,“56dp”
资料来源:“data/logo/kivy-icon-256.png”
MDLabel:
文本:“导航到屏幕”
字体样式:“按钮”
尺寸提示:无
高度:自身纹理大小[1]
MDLabel:
文本:“KivyMD导航抽屉和屏幕管理器”
字体样式:“标题”
尺寸提示:无
高度:自身纹理大小[1]
滚动视图:
抽屉列表:
id:集装箱
屏幕管理器:
登录筛选:
菜单屏幕:
名称:“登录屏幕”
MDF布局:
MDLabel:
文本:“登录”
位置提示:{“中心”:.85}
字体样式:“H4”
哈利恩:“中心”
主题\文本\颜色:“自定义”
文本颜色:0,0,0,1
MDLabel:
文字:“欢迎使用我的应用”
位置提示:{“中心”:.75}
字体样式:“H5”
哈利恩:“中心”
主题\文本\颜色:“自定义”
文本颜色:0,0,0,1
MDTextField:
id:用户名
提示文字:“用户名”
pos_提示:{“center_x”:.5,“center_y”:.6}
当前\u提示\u文本\u颜色:0,0,0,1
大小\u提示\u x:.8
helper\u文本:“必需”
帮助器\u文本\u模式:“打开\u错误”
右图标:“帐户”
必填项:True
MDTextField:
id:密码
提示文字:“密码”
pos_提示:{“center_x”:.5,“center_y”:.5}
密码:True
当前\u提示\u文本\u颜色:0,0,0,1
大小\u提示\u x:.8
helper\u文本:“必需”
帮助器\u文本\u模式:“打开\u错误”
右图标:“帐户”
必填项:True
MDRaisedButton:
文本:“登录”
pos_提示:{“center_x”:.5,“center_y”:.4}
大小\u提示\u x:.5
新闻界:
app.login()
主题\文本\颜色:“自定义”
文本颜色:0,0,0,1
:
名称:“菜单”
屏幕:
导航布局:
屏幕管理器:
屏幕:
盒子布局:
方向:“垂直”
MDToolbar:
标题:“Mhell应用程序”
左侧操作项:[[“菜单”,lambda x:nav_抽屉。设置状态(“切换”)]]
标高:10
小装置:
屏幕管理器:
id:屏幕管理器
主屏幕:
CreateUserScreen:
上载屏幕:
MDNavigationDrawer:
id:nav_抽屉
ContentNavigationDrawer:
id:content\u抽屉
:
名称:'main'
MDLabel:
文本:“主屏幕”
哈利恩:“中心”
残疾人士:对
MDIconButton:
图标:root.icon
用户字体大小:“16sp”
位置提示:{“中心”:.5}
MDLabel:
text:root.text
字体样式:“标题”
大小提示:无
宽度:自纹理大小[0]
文本大小:无,无
:
名称:“创建用户”
MDLabel:
文本:“创建用户”
哈利恩:“中心”
位置提示:{“中心”:.85}
字体样式:“H5”
尺寸提示:无
高度:dp(36)
网格布局:
科尔斯:1
填充:20,20
间距:5,5
尺寸提示:1,0.87
MDTextField:
id:用户名
提示文字:“用户名”
当前\u提示\u文本\u颜色:0,0,0,1
大小\u提示\u x:.8
helper\u文本:“必需”
帮助器\u文本\u模式:“打开\u错误”
右图标:“帐户”
必填项:True
MDTextField:
id:密码
提示文字:“密码”
当前\u提示\u文本\u颜色:0,0,0,1
大小\u提示\u x:.8
helper\u文本:“必需”
帮助器\u文本\u模式:“打开\u错误”
右图标:“帐户”
必填项:True
MDTextField:
id:分行
提示文字:“分支”
当前\u提示\u文本\u颜色:0,0,0,1
大小\u提示\u x:.8
helper\u文本:“必需”
帮助器\u文本\u模式:“打开\u错误”
右图标:“帐户”
必填项:True
on_focus:root.branch_drop()
:
名称:“上传”
MDLabel:
文本:“让我们上传一些文件!”
哈利恩:“中心”
MDRectangleFlatButton:
文本:“返回”
位置提示:{'center_x':0.5,'center_y':0.2}
按:root.manager.current='profile'