KivyMD, Kivy, ScreenManager, Текстовое поле не изменяют текст

#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 .