Как получить текст из текстового поля KivyMD?

#kivy #kivy-language #kivymd

Вопрос:

Я пытаюсь получить текст из текстового поля, но, похоже, не могу сделать это правильно. Я хочу получить текст из поля mdtext на экране входа в систему. Это мой файл .kv:

 ScreenManager:
    LoginScreen:
    VaultScreen:
<LoginScreen>:
    id: login
    name: 'login'
    MDTextField:
        id: master_password
        hint_text: "Master Password"
        size_hint_x: None
        width: 200
        font_size: 18
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        password: True
    MDRectangleFlatButton:
        text: "Unlock"
        font_size: 12
        pos_hint: {"center_x": 0.5, "center_y": 0.4}
        on_release: app.verify()
<VaultScreen>:
    name: 'vault'
    MDLabel:
        text: 'Vault'
        halign: 'center'
    MDRectangleFlatButton:
        text: 'Back'
        pos_hint: {'center_x': 0.5, 'center_y': 0.1}
        on_press: root.manager.current = 'login'
 

А это мой файл .py:

     from kivymd.app import MDApp
    from kivy.lang.builder import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    class ScMn(ScreenManager):
        pass
    
    class LoginScreen(Screen):
        pass
    
    class VaultScreen(Screen):
        pass
    
    class App(MDApp):
        def build(self):
            screen = Builder.load_file('passr.kv')
            return screen
        
        def verify(self):
            # this is where I want to get the text
            master = self.root.ids.login.master_password.text
            pass
        
    App().run()
 

Когда я пытаюсь получить содержимое self.root.id, я получаю пустой словарь.

Ответ №1:

Ваш код:

 self.root.ids.login.master_password.text
 

пытается получить доступ ids self.root к тому , что есть, но self.root есть ScreenManager , и у него нет ids . ids Определенные в kv хранятся в ids словаре виджета, который является корнем правила, содержащего id определение. Поскольку вы определяете некоторые ids из них в <LoginScreen> правиле, ids они будут находиться в LoginScreen объекте. Таким образом , вы должны получить ссылку на LoginScreen , и вы можете сделать это, используя get_screen() метод, подобный этому:

 self.root.get_screen('login').ids.master_password.text