#python #kivy #kivy-language #kivymd
Вопрос:
Когда я пытаюсь извлечь текстовое значение из своего текстового поля, я всегда получаю пустое. В то же время, если я установлю текстовое значение по умолчанию, например «123», то независимо от того, введу ли я что-либо в свое текстовое поле в консоли, я все равно получу «123». У меня было предположение, что это может быть связано с каким-то дублированием экрана, но когда я вызываю self.root.get_screen («регистрация»). Идентификаторы, я получаю три разных идентификатора, т. Е. дублирования нет. Я буду рад вашей помощи
мой.кв
<RegistrationScreen>:
name: "registration"
MDCard:
size_hint: None, None
size: 400, 600
orientation: "vertical"
pos_hint: {"center_x": 0.5, "center_y": 0.5}
padding: 15
spacing: 50
MDLabel:
text: "Регистрация"
font_name: 'fonts/montserrat-bold.ttf'
font_size: 20
color: .43, 0, .48, 1
halign: "center"
BoxLayout:
size_hint: None, None
size: 200, 160
pos_hint: {"center_x": 0.5}
orientation: "vertical"
MDTextField:
id: pomogite
hint_text: "Rectangle mode"
mode: "rectangle"
helper_text_mode: "on_focus"
hint_text: "Введите логин"
helper_text: "Минимум 6 символов (a-z, A-Z, 0-9)"
icon_right: "account"
color_mode: 'custom'
line_color_focus: .43, 0, .48, 1
size_hint_x: None
width: 250
pos_hint: {"center_x": .5, "center_y": .3}
text: "Начинайте ввод"
MDTextField:
id: textfield_password
hint_text: "Rectangle mode"
mode: "rectangle"
helper_text_mode: "on_focus"
hint_text: "Введите пароль"
helper_text: "Минимум 6 символов (a-z, A-Z, 0-9)"
icon_right: "form-textbox-password"
color_mode: 'custom'
line_color_focus: .43, 0, .48, 1
size_hint_x: None
width: 250
pos_hint: {"center_x": .5, "center_y": .3}
MDRectangleFlatButton:
id: reg
text: "Регистрация"
theme_text_color: "Custom"
text_color: .43, 0, .48, 1
line_color: .43, 0, .48, 1
pos_hint: {"center_x": .5}
on_press: app.registration()
main.py
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.app import MDApp
from client import Client
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivy.uix.boxlayout import BoxLayout
from kivymd.uix.textfield import MDTextField
sm = ScreenManager()
class LoadingScreen(Screen):
pass
class AuthorizationScreen(Screen):
pass
class RegistrationScreen(Screen):
pass
class MyApp(MDApp):
def build(self):
sm.add_widget(LoadingScreen(name='loading'))
sm.add_widget(AuthorizationScreen(name='authorization'))
sm.add_widget(RegistrationScreen(name='registration'))
sm.switch_to(AuthorizationScreen())
return sm
def fff(self):
self.screen.ids.text_field_error.error = True
sm.switch_to(LoadingScreen())
def registration(self):
addwindow_instance = self.root.get_screen('registration')
print(addwindow_instance.ids)
print(addwindow_instance.ids["pomogite"].text)
MyApp().run()
Ответ №1:
Пара ошибок в вашем коде, всякий раз , когда вы используете имя класса, за которым следует ()
, вы создаете новый экземпляр этого класса. Итак, линия:
sm.switch_to(AuthorizationScreen())
создает новый экземпляр AuthorizationScreen
в дополнение к уже созданному в строке:
sm.add_widget(AuthorizationScreen(name='authorization'))
Лучший подход состоит в том , чтобы использовать sm.current =
, а не sm.switch_to
, как это:
def build(self):
sm.add_widget(LoadingScreen(name='loading'))
sm.add_widget(AuthorizationScreen(name='authorization'))
sm.add_widget(RegistrationScreen(name='registration'))
sm.current = 'authorization'
return sm
Это переключило текущий экран на уже существующий AuthorizationScreen
экземпляр. Или, еще проще, просто поместите его в AuthorizationScreen
качестве первого добавленного Screen
, и он станет текущим Screen
:
def build(self):
sm.add_widget(AuthorizationScreen(name='authorization'))
sm.add_widget(LoadingScreen(name='loading'))
sm.add_widget(RegistrationScreen(name='registration'))
return sm
Та же ошибка появляется в вашем fff()
методе в строке:
sm.switch_to(LoadingScreen())
что означает создание нового экземпляра LoadingScreen
, а не использование уже существующего. Эта строка, вероятно, должна быть:
sm.current = 'loading'
Комментарии:
1. О да, спасибо за помощь. Я также изначально думал, что экраны каким-то образом дублировались, но я не мог понять, в чем была проблема. В конце концов, при отображении self.root.get_screen («регистрация»). Идентификаторы получили три разных идентификатора, почему? Еще раз спасибо
2. Поскольку вы определили три идентификатора в
kv
.