KivyMD-从Screen类访问ID

时间:2020-10-20 05:55:24

标签: python-3.x kivymd

我正在学习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'

0 个答案:

没有答案