Решение
Решение состоит в том, чтобы использовать Kivy ObjectProperty для подключения к идентификаторам. Пожалуйста, обратитесь к примеру для деталей.
Файл kv
Добавьте следующий идентификатор и ObjectProperties
- Добавить
id: screen1
- Добавить ObjectProperty,
screen1: screen1
- идентификатор не является строкой. Удалить цитаты из
id: username
и id: password
- Добавить ObjectProperty,
username: username
- Добавить ObjectProperty,
password: password
- Добавить
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
- Переместить
check_data_login()
метод из class MyApp()
в class MyLayout()
- Заменить
self.username.text
на self.scr_mngr.screen1.username.text
- Заменить
self.password.text
на self.scr_mngr.screen1.password.text
- Добавлено 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()
выход