您如何在 KivyMD 的屏幕中引用文本字段 ID?

How do you reference a text field ID in a screen in KivyMD?

我正在尝试使用 python 中编写的函数来编辑 KivyMD 屏幕中的文本字段。如果 kivy 代码不是屏幕的一部分,但一旦进入屏幕,id 似乎有问题,它就可以正常工作。

from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.gridlayout import MDGridLayout
from kivymd.uix.picker import MDDatePicker
from kivymd.uix.picker import MDThemePicker

screen_helper = """
ScreenManager:
    AssignmentScreen:

<AssignmentScreen>:
    name: 'assignment'
    MDGridLayout:
        pos_hint: {'center_y':0.5}
        rows: 6
        row_default_height: 125
        adaptive_height: True
        MDTextField:
            hint_text: "Assignment title"
        MDTextField:
            hint_text: "Module"
        MDBoxLayout:
            MDTextField:
                id: pickedDates
                hint_text: "Deadline"
            MDRectangleFlatButton:
                text: "Pick Date"
                on_press: app.show_date_picker()
        MDTextField:
            hint_text: "Estimated hours"
        MDTextField:
            hint_text: "Assignment Weight (%)"
"""


class AssignmentScreen(Screen):
    pass


sm = ScreenManager()
sm.add_widget(AssignmentScreen(name='assignment'))


class AssignmentTracker(MDApp):

    def show_theme_picker(self):
        theme_dialog = MDThemePicker()
        theme_dialog.open()

    def show_date_picker(self):
        MDDatePicker(self.set_date).open()

    def set_date(self, date_obj):
        self.root.ids.pickedDates.text = "test"
        pass

    def build(self):
        self.theme_cls.theme_style = "Dark"
        screen = Builder.load_string(screen_helper)
        return screen

Window.size = (350, 700)
AssignmentTracker().run()

当函数 set_date() 为 运行 时,它会因 AttributeError: 'super' object has no attribute '__getattr__' 而崩溃,因为如果它在屏幕内,我不知道如何引用 MDTextField。

这是因为MDTextField处于不同的class

from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.picker import MDDatePicker
from kivymd.uix.picker import MDThemePicker

Window.size = (350, 700)

screen_helper = """
Screen:
    ScreenManager:
        AssignmentScreen:
            id: assignment_scr

<AssignmentScreen>:
    name: 'assignment'
    MDGridLayout:
        pos_hint: {'center_y':0.5}
        rows: 6
        row_default_height: 125
        adaptive_height: True
        
        MDTextField:
            hint_text: "Assignment title"
            
        MDTextField:
            hint_text: "Module"
            
        MDBoxLayout:
            MDTextField:
                id: pickedDates
                hint_text: "Deadline"
            MDRectangleFlatButton:
                text: "Pick Date"
                on_press: app.show_date_picker()
                
        MDTextField:
            hint_text: "Estimated hours"
        MDTextField:
            hint_text: "Assignment Weight (%)"
"""


class AssignmentScreen(Screen):
    pass


sm = ScreenManager()
sm.add_widget(AssignmentScreen(name='assignment'))


class AssignmentTracker(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def build(self):
        self.theme_cls.theme_style = "Dark"
        screen = Builder.load_string(screen_helper)
        return screen

    def show_theme_picker(self):
        theme_dialog = MDThemePicker()
        theme_dialog.open()

    def show_date_picker(self):
        MDDatePicker(self.set_date).open()

    def set_date(self, date_obj):
        self.root.ids.assignment_scr.ids.pickedDates.text = "test"


AssignmentTracker().run()