Python, KivyMD получают данные из текстовых полей - PullRequest
0 голосов
/ 04 июля 2018

Уже несколько недель я пользуюсь KivyMD и влюбился в эту тему Kivy. Вот мой вопрос: я делаю многоэкранное приложение, используя KivyMD, и мой первый экран - это «экран входа». И я хочу добавить функцию в мой основной класс, которая получает значение моего текстового поля «имя пользователя» и моего текстового поля «пароль». И если идентификаторы верны, я получаю «screen2».

Вот мой код:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemeManager

class MyLayout(BoxLayout):

    scr_mngr = ObjectProperty(None)

    def change_screen(self, screen, *args):
        self.scr_mngr.current = screen


KV = """
#:import Toolbar kivymd.toolbar.Toolbar
#:import ThemeManager kivymd.theming.ThemeManager
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerDivider 
kivymd.navigationdrawer.NavigationDrawerDivider
#:import NavigationDrawerToolbar 
kivymd.navigationdrawer.NavigationDrawerToolbar
#:import NavigationDrawerSubheader 
kivymd.navigationdrawer.NavigationDrawerSubheader
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
#:import MDSwitch kivymd.selectioncontrols.MDSwitch
#:import MDList kivymd.list.MDList
#:import OneLineListItem kivymd.list.OneLineListItem
#:import TwoLineListItem kivymd.list.TwoLineListItem
#:import ThreeLineListItem kivymd.list.ThreeLineListItem
#:import OneLineAvatarListItem kivymd.list.OneLineAvatarListItem
#:import OneLineIconListItem kivymd.list.OneLineIconListItem
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem
#:import MDTextField kivymd.textfields.MDTextField
#:import MDSpinner kivymd.spinner.MDSpinner
#:import MDCard kivymd.card.MDCard
#:import MDSeparator kivymd.card.MDSeparator
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import colors kivymd.color_definitions.colors
#:import SmartTile kivymd.grid.SmartTile
#:import MDSlider kivymd.slider.MDSlider
#:import MDTabbedPanel kivymd.tabs.MDTabbedPanel
#:import MDTab kivymd.tabs.MDTab
#:import MDProgressBar kivymd.progressbar.MDProgressBar
#:import MDAccordion kivymd.accordion.MDAccordion
#:import MDAccordionItem kivymd.accordion.MDAccordionItem
#:import MDAccordionSubItem kivymd.accordion.MDAccordionSubItem
#:import MDThemePicker kivymd.theme_picker.MDThemePicker
#:import MDBottomNavigation kivymd.tabs.MDBottomNavigation
#:import MDBottomNavigationItem kivymd.tabs.MDBottomNavigationItem

#:import partial functools.partial

MyLayout:
    scr_mngr: scr_mngr
    orientation: 'vertical'

    ScreenManager:
        id: scr_mngr
        Screen:
            name: 'screen1'
            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:
                        text: 'Connexion'
                        theme_text_color: 'Secondary'
                        font_style:"Title"
                        size_hint_y: None
                        height: dp(36)
                    MDSeparator:
                        height: dp(1)
                    MDTextField:
                        id: 'username'
                        hint_text: "Username "
                        helper_text_mode: "on_focus"
                    MDTextField:
                        id: 'password'
                        hint_text: "Password "
                        helper_text_mode: "on_focus"

                    MDFlatButton:
                        text: "Connexion"
                        pos_hint: {'center_x': 0.5}
                        on_release: root.check_data_login()
        Screen:
            name: 'screen2'
            Toolbar:
                id: toolbar
                title: "Welcome ! "
                pos_hint: {'center_x': 0.5, 'center_y': 0.97}
                md_bg_color: app.theme_cls.primary_color
                background_palette: 'DeepPurple'
                background_hue: 'A400'
                left_action_items: [['arrow-left', p 
                    partial(root.change_screen, 'screen1') ]]
                right_action_items: [['animation', lambda x: M 
                    MDThemePicker().open()]]

            MDLabel:
                font_style: 'Title'
                theme_text_color: 'Primary'
                text: "Data :"
                height: self.texture_size[1] + dp(3)
                halign: 'center'
                pos_hint: {'center_x': 0.5, 'center_y': 0.85}




"""


class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        return Builder.load_string(KV)


    def check_data_login(self):
        username = self.username.text
        password= self.password.text

        print(username)
        print(password)

MyApp().run()

1 Ответ

0 голосов
/ 05 июля 2018

Решение

Решение состоит в том, чтобы использовать Kivy ObjectProperty для подключения к идентификаторам. Пожалуйста, обратитесь к примеру для деталей.

Файл kv

Добавьте следующий идентификатор и ObjectProperties

  1. Добавить id: screen1
  2. Добавить ObjectProperty, screen1: screen1
  3. идентификатор не является строкой. Удалить цитаты из id: username и id: password
  4. Добавить ObjectProperty, username: username
  5. Добавить ObjectProperty, password: password
  6. Добавить password: True в TextInput, чтобы пароль был замаскирован

Фрагменты - файл kv

ScreenManager:
    id: scr_mngr
    screen1: screen1

    Screen:
        id: screen1
        name: 'screen1'
        username: username
        password: password

        MDCard:
            ...
                MDTextField:
                    id: username
                    hint_text: "Username "
                    helper_text_mode: "on_focus"

                MDTextField:
                    id: password
                    hint_text: "Password "
                    helper_text_mode: "on_focus"
                    password: True

Файл Python

  1. Переместить check_data_login() метод из class MyApp() в class MyLayout()
  2. Заменить self.username.text на self.scr_mngr.screen1.username.text
  3. Заменить self.password.text на self.scr_mngr.screen1.password.text
  4. Добавлено if оператор для проверки имени пользователя и пароля

Snippets - Python File

class MyLayout(BoxLayout):

    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 == "KivyMD" and password == "kivy":
            self.change_screen("screen2")

Kivy Documentation

Синтаксис файла kv

Если виджет не имеет свойства с указанным именем, ObjectProperty будет автоматически создан и добавлен в виджет.

Ссылки на виджеты »идентификаторы

Внимание

При назначении значения идентификатору, помните, что это не строка. Кавычек нет: хорошо -> id: значение, плохо -> id: 'значение'

Доступ к виджетам, определенным внутри Kv lang в вашем коде Python

обычно считается «наилучшей практикой» использования ObjectProperty. Это создает прямую ссылку, обеспечивает более быстрый доступ и более Явный.

Пример

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemeManager


class MyLayout(BoxLayout):

    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 == "KivyMD" and password == "kivy":
            self.change_screen("screen2")

    def change_screen(self, screen, *args):
        self.scr_mngr.current = screen


KV = """
#:import Toolbar kivymd.toolbar.Toolbar
#:import ThemeManager kivymd.theming.ThemeManager
#:import MDNavigationDrawer kivymd.navigationdrawer.MDNavigationDrawer
#:import NavigationLayout kivymd.navigationdrawer.NavigationLayout
#:import NavigationDrawerDivider kivymd.navigationdrawer.NavigationDrawerDivider
#:import NavigationDrawerToolbar kivymd.navigationdrawer.NavigationDrawerToolbar
#:import NavigationDrawerSubheader kivymd.navigationdrawer.NavigationDrawerSubheader
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
#:import MDSwitch kivymd.selectioncontrols.MDSwitch
#:import MDList kivymd.list.MDList
#:import OneLineListItem kivymd.list.OneLineListItem
#:import TwoLineListItem kivymd.list.TwoLineListItem
#:import ThreeLineListItem kivymd.list.ThreeLineListItem
#:import OneLineAvatarListItem kivymd.list.OneLineAvatarListItem
#:import OneLineIconListItem kivymd.list.OneLineIconListItem
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem
#:import MDTextField kivymd.textfields.MDTextField
#:import MDSpinner kivymd.spinner.MDSpinner
#:import MDCard kivymd.card.MDCard
#:import MDSeparator kivymd.card.MDSeparator
#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import colors kivymd.color_definitions.colors
#:import SmartTile kivymd.grid.SmartTile
#:import MDSlider kivymd.slider.MDSlider
#:import MDTabbedPanel kivymd.tabs.MDTabbedPanel
#:import MDTab kivymd.tabs.MDTab
#:import MDProgressBar kivymd.progressbar.MDProgressBar
#:import MDAccordion kivymd.accordion.MDAccordion
#:import MDAccordionItem kivymd.accordion.MDAccordionItem
#:import MDAccordionSubItem kivymd.accordion.MDAccordionSubItem
#:import MDThemePicker kivymd.theme_picker.MDThemePicker
#:import MDBottomNavigation kivymd.tabs.MDBottomNavigation
#:import MDBottomNavigationItem kivymd.tabs.MDBottomNavigationItem

#:import partial functools.partial

MyLayout:
    scr_mngr: scr_mngr
    orientation: 'vertical'

    ScreenManager:
        id: scr_mngr
        screen1: screen1

        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:
                        text: 'Connexion'
                        theme_text_color: 'Secondary'
                        font_style:"Title"
                        size_hint_y: None
                        height: dp(36)

                    MDSeparator:
                        height: dp(1)

                    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: "Connexion"
                        pos_hint: {'center_x': 0.5}
                        on_release: root.check_data_login()
        Screen:
            name: 'screen2'

            Toolbar:
                id: toolbar
                title: "Welcome ! "
                pos_hint: {'center_x': 0.5, 'center_y': 0.97}
                md_bg_color: app.theme_cls.primary_color
                background_palette: 'DeepPurple'
                background_hue: 'A400'
                left_action_items: [['arrow-left', partial(root.change_screen, 'screen1') ]]
                right_action_items: [['animation', lambda x: MDThemePicker().open()]]

            MDLabel:
                font_style: 'Title'
                theme_text_color: 'Primary'
                text: "Data :"
                height: self.texture_size[1] + dp(3)
                halign: 'center'
                pos_hint: {'center_x': 0.5, 'center_y': 0.85}
"""


class MyApp(App):
    title = "Kivy MD Demo"
    theme_cls = ThemeManager()

    def build(self):
        return Builder.load_string(KV)


MyApp().run()

выход

Img01 - username & password entered Img02 - Screen2 Displayed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...