Home > Net >  Recup input value through screen manager kivy
Recup input value through screen manager kivy

Time:09-29

I want to catch a value from my first screen into my thirdscreen.

In the first, I write my name in an input field. I go to the next window.

And I try to show my name in this last window.

So I share the code with you and I hope I will find an issue.

Python code :

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen



#define ou different screens
class FirstWindow(Screen):
    def envoyer(self):
        name = self.ids.nom_input.text

        self.ids.my_name.text = name


class SecondWindow(Screen):
    pass

class ThirdWindow(Screen):
    #PROBLEM HERE
    def on_press(self):
        self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text


class WindowManager(ScreenManager):
    pass

class MonWidget(Widget):
    pass


kv = Builder.load_file('new_window.kv')

class AwesomeApp(App):

    def build(self):
        Window.clearcolor = (0,0,0,0)
        return kv

    
if __name__ == '__main__':
    AwesomeApp().run()

My KV CODE :

WindowManager:
    FirstWindow:
    SecondWindow:
    ThirdWindow:




<FirstWindow>:
    name: "romain"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            id: my_name
            text: "Entrez votre nom"
            font_size: 32

        TextInput:
            id: nom_input
            multiline: False
            size_hint: (1, .5)

        Button:
            text: "Next screen"
            font_size: 32
            on_press: root.envoyer()
            on_release:
                app.root.current = "Mickael"
                root.manager.transition.direction = "left"
            


<SecondWindow>:
    name: "Mickael"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Entre votre ville"
            font_size: 32

        TextInput:
            id: ville_input
            multiline: False
            size_hint: (1, .5)


        Button:
            text: "Vérifier les infos"
            font_size: 32
            on_release:
                app.root.current = "foncier"
                root.manager.transition.direction = "left"

        Button:
            text: "go back first screen"
            font_size: 32
            on_release:
                app.root.current = "romain"
                root.manager.transition.direction = "right"

    


<ThirdWindow>:
    name: "foncier"

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height

        Label:
            text: "Verifier : "
            font_size: 32


        Label:
            id: recup_infos
            text: ""
            font_size: 32
            color: 'white'


        Button:
            text: "On press"
            font_size: 32
            #Problem HERE
            on_press: root.on_press()

        Button:
            text: "Précedent"
            font_size: 32
            on_release:
                app.root.current = "Mickael"
                root.manager.transition.direction = "right"

Could you help me ? Thank you Romain

CodePudding user response:

In your on_press method:

def on_press(self):
    self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text

self.root.get_screen('FirstWindow').ids.my_name.text isn't the correct way to get access to widgets outside of the class that you are in right now, or in this situation, screen. The correct way is to use the App.get_running_app() method:

self.ids.recup_infos.text = App.get_running_app().root.ids.First.ids.my_name.text

But before doing that, you have to give ids to the screens of your app, so that the First argument of the method demonstrated above actually makes sense:

WindowManager:
    FirstWindow:
        id: First 
        # "First" is the id of the FirstWindow class
        # which can also explain why there was a "First" arg
        # inside "App.get_running_app().root.ids.First.ids.my_name.text"
    SecondWindow:
        id: Second
    ThirdWindow:
        id: Third

Still confused to why this works? Let's divide the attributes of App.get_running_app().root.ids.First.ids.my_name.text into 3 parts:

  • App.get_running_app(): this method returns the location of your running App class, in this case AwesomeApp. This also acts as self if you were to get the variable inside the App object itself
  • .root.ids.First: if you read the Kivy documentation, or just simply watched Kivy course videos online, carefully, you should know that self.root.ids inside the App object returns a list of ids of the widgets inside your root widget. In this case, App.get_running_app().root.ids is doing the same thing here, and your screens are passed in the ScreenManager root widget, hence make First an available attribute in App.get_running_app().root.ids
  • .ids.my_name.text: same as above, App.get_running_app().root.ids.First acts the same as self if you were to run it in your FirstWindow class, which gives you the opportunity to get access to variables outside of your working classes/screens
  • Related