Search code examples
pythonkivykivy-language

why i can't get my text from kivy TextInput?


well I'm entirely new to kivy, it's a bit complicated but I'm trying to get on

so I'm stuck on something, I'm trying to get a text from a TextInput, but i can't, it just refuse to do it, can anyone crack it?

KV code:

<Signin>:
    
    title:"Telegram Checker"
    AnchorLayout:
        
        anchor_x: 'center'
        anchor_y: 'center'

        BoxLayout:
            
            width : 600
            orientation: 'vertical'
            size_hint: None, None
            
            Label:
                
                text:"Telegram Sign-In"
                
            TextInput:
                id : tel
                input_type:'tel'
                width:600
                multiline: False
                hint_text: '+XXXXXXXXXXXXX'
                size_hint: None, None
                height: 50
    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'bottom'
        BoxLayout:
            padding: 20
            spacing: 100
            width : 600
            orientation: 'vertical'
            size_hint: None, None
            
            Button:
                text: "Next ->"
                #size_hint: 0.5,6
                height : 100
                pos:self.pos
                on_release : app.send_code_request()

the function that's not getting the text :

class MyApp(App):
    
    def build(self):
        self.title="Telegram Checker"
        return screen_manager
    
    def send_code_request(self):
        phone = self.root.ids.tel.text
        print(phone) 

Solution

  • The code at the bottom is runnable and it passes the argument you requested. It shows this being done two ways. I suggest not using the .ids property because you can link the items at the top of the .kv class and assign type hints to the object like this:

    tel: TextInput
    

    full code:

    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.textinput import TextInput
    from kivy.lang import Builder
    
    
    Builder.load_string('''
    <Signin>:
        # match the python object to the kivy id
        # python on the left: kivy id on the right
        tel: tel
    
        title:"Telegram Checker"
        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'center'
            BoxLayout:
                width : 600
                orientation: 'vertical'
                size_hint: None, None
                Label:
                    text:"Telegram Sign-In"
                TextInput:
                    id : tel
                    input_type:'tel'
                    width:600
                    multiline: False
                    hint_text: '+XXXXXXXXXXXXX'
                    size_hint: None, None
                    height: 50
        AnchorLayout:
            anchor_x: 'center'
            anchor_y: 'bottom'
            BoxLayout:
                padding: 20
                spacing: 100
                width : 600
                orientation: 'vertical'
                size_hint: None, None
                Button:
                    text: "Next ->"
                    #size_hint: 0.5,6
                    height : 100
                    pos:self.pos
                    on_release : app.send_code_request(tel.text, self)
    '''
    )
    
    
    class Signin(Screen):
        # python objects mapped in the .kv file.  this is a type hint which will help with auto-complete
        tel: TextInput
    
        def __init__(self, **kwargs):
    
            super().__init__(**kwargs)
            print(f" hint text is {self.tel.hint_text}")
    
    
    class MyApp(App):
    
        def __init__(self, **kwargs):
    
            super().__init__(**kwargs)
            self.my_top_widget = ScreenManager()
            self.signin_screen = Signin(name="sign_in")
    
        def send_code_request(self, phone: str, your_button, *args) -> None:
    
            # this is one way
            print(f" by id {self.signin_screen.ids.tel.text}")
    
            print(f"vale passed={phone} \nyour button {your_button} other args {args}")
    
        def build(self):
    
            self.title = "Telegram Checker"
    
            self.my_top_widget.add_widget(self.signin_screen, name="sign_in")
            self.my_top_widget.current = "sign_in"
            return self.my_top_widget
    
    
    my_app = MyApp()
    my_app.run()