0

After creating a MDTextField in a MDDialog with KivyMD, I am trying to access the text entered by the user in the MDTextField and change a label's text to whatever was entered but to no avail. Here is my code below:

# importing all the necessary modules and inheriting my dialog from boxlayout

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout   
from kivymd.uix.dialog import MDDialog     

# creating a string which will contain all my kv definitions that I would put in a .kv file

the_kv_file = '''
<ContentOfAppointmentDialog>:
    orientation: "vertical"
    spacing: "10dp"
    size_hint: None, None
    size: "250dp", "150dp"

    MDTextField:
        hint_text: "Enter details"
        id: the_textfield
        helper_text: "Be detailed and precise"
        helper_text_mode: "on_focus"
        max_text_length: 75
        multiline: True
        mode: "rectangle"

    MDFlatButton:
        text: "DISCARD"
        on_release: app.CloseDialog()
    MDFlatButton:
        text: "DONE"
        on_release: app.ChangingLabel()

MDFloatLayout:
   MDLabel:
       id: label_to_change
       text: "hello"
   MDFloatingActionButton:
       icon: 'pencil'
       on_press: app.OpenDialog()  
'''
# Creating the classes of My main app and the dialog as well as the required functions

class ContentOfAppointmentDialog(BoxLayout):    # this defines the dialogs layout
    pass


class MainApp(MDApp):   # my main app
    def build(self):
        self.main_screen = Builder.load_string(the_kv_file)
        self.dialog = MDDialog(title="my example", type="custom", content_cls=ContentOfAppointmentDialog()) # defining the dialog
        self.AccessDialog = ContentOfAppointmentDialog()

        return self.main_screen

    def OpenDialog(self):   # opens dialog
        self.dialog.open()


    def CloseDialog(self):  # closes dialog
        self.dialog.dismiss()

# this is the function that is not working as I intended it to    
    def ChangingLabel(self):    # function that is supposed to change the label to what users input is
        self.main_screen.ids.label_to_change = self.AccessDialog.ids.the_textfield.text
        self.dialog.dismiss()


MainApp().run()
David Buck
  • 3,752
  • 35
  • 31
  • 35

1 Answers1

0

You can use my example code, I changed a few things in the code you have provided, you can always access the content or the widgets from everywhere by just trying to link them with functions defined in the main class of the App, always following the Root access from the Kivy Lang, jbsidis:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout   
from kivymd.uix.dialog import MDDialog     

always_use_a_single_python_script_that_includes_everything_including_the_kv_lang_section = '''
<ContentOfAppointmentDialog>:
    orientation: "vertical"
    spacing: "10dp"
    BoxLayout:
        orientation: "vertical"

        MDTextField:
            id: the_textfield
            hint_text: "Enter details"
            helper_text: "Be detailed and precise"
            helper_text_mode: "on_focus"
            max_text_length: 75
            multiline: True
            mode: "rectangle" #if you need to change text in real time while typing, you have to use the on_text: event and link it like the Done button function, on_text: app.ChangingLabel(root.ids.the_textfield.text) or also on_text: app.ChangingLabel(self.text)
        BoxLayout: #jbsidis #this is needed to have the buttons Horizontally
            MDFlatButton:
                text: "Discard"
                on_release:
                    app.CloseDialog()
            MDFlatButton:
                markup: True
                text: "[b]Done!"
                on_release:
                    app.ChangingLabel(root.ids.the_textfield.text)

MDFloatLayout:

    #BoxLayout:
    MDTextButton:
        markup: True
        pos_hint: {"center_x": .5, "center_y": .7}
        id: label_to_change
        text: "[color=000000]jbsidis"
    MDFloatingActionButton:
        pos_hint: {"center_x": .5, "center_y": .5}
        icon: 'pencil'
        on_press: app.OpenDialog()  
'''
# Creating the classes of My main app and the dialog as well as the required functions
class ContentOfAppointmentDialog(BoxLayout):    # this defines the dialogs layout
    pass
#jbsidis
class MainApp(MDApp):   # my main app
    def build(self):
        self.main_screen = Builder.load_string(always_use_a_single_python_script_that_includes_everything_including_the_kv_lang_section)
        self.dialog = MDDialog(auto_dismiss=False,title="Enter your name:", type="custom", content_cls=ContentOfAppointmentDialog()) # defining the dialog
        #self.AccessDialog = ContentOfAppointmentDialog() #this is a great idea you just need to change a few things
        return self.main_screen
    def OpenDialog(self):   # opens dialog
        self.dialog.open()
    def CloseDialog(self):  # closes dialog
        self.dialog.dismiss()

# this is the function that is not working as I intended it to    
    def ChangingLabel(self,this_argument_helps_to_transport_the_text_entered_in_the_text_field_of_the_dialog):    # function that is supposed to change the label to what users input is
        #self.main_screen.ids.label_to_change = self.AccessDialog.ids.the_textfield.text
        #ROOT.ids.AnyID_in_the_root_of_the_kv_lang
        self.main_screen.ids.label_to_change.text="[b][color=ff0000]"+str(this_argument_helps_to_transport_the_text_entered_in_the_text_field_of_the_dialog)
        self.dialog.dismiss()


MainApp().run()

You will find that in many cases you will have to define a lot of functions or classes with arguments or non-required arguments but they are needed to make apps to work, it is programmatically needed, greetings from El Salvador, picture:

enter image description here