Search code examples
pythonkivykivy-language

Getting value from slider to display on a different screen (python, kivy)


I am trying to display the value of a slider on a different screen. i have tried this(below code) but for some reason, the value doesn't seem to show up. the code runs fine but no value is returned. Thanks for your help :) Cheers.

temperature screen

here is a snippet of the python code:

class Thermostat(Screen):
label = StringProperty()
    def display(self):
        tempVal = self.label 
        return str(tempVal)

and the kv files:

<Thermostat>:
name: "thermostat"
BoxLayout:
    orientation: 'horizontal'
    cols: 2

    Label:
        id: label
        font_size: "11sp"
        text: "INSIDE: " + root.display()

    Label:
        text: "More Info"
        font_size: "11sp"

kv file 2:This screen holds the true value from the slider, i am trying to pass that value to the Thermostat screen.

<Temperature>:
BoxLayout:
    size_hint_y: None
    height: '48dp'
    cols: 3

    Label:
        text: 'THERMOSTAT'

    Slider:
        id: temp
        min: 40
        max: 100
        value: 1
        step: 1
        on_value: app.root.get_screen('thermostat').label = str('{}'.format(temp.value))    

    Label:
        id: slide_val
        text: '{}'.format(temp.value)

Solution

  • root.display is only called once, at the beginning of the program. For it to work well, every time you change the value of the slider root.display should be called.

    However, it is very simple to do this using propertis in kv languaje:

    from kivy.app import App
    from kivy.uix.screenmanager import Screen, ScreenManager
    from kivy.lang.builder import Builder
    
    
    
    Builder.load_string('''
    
    <Manager>:
        id: manager
        Thermostat:
            id: thermostat
            name: 'thermostat'
            manager: 'screen_manager'
            temp: temperature.temp                    #<<<<<<<<<<<<
    
        Temperature:
            id: temperature
            name: 'temperature'
            manager: 'screen_manager'
    
    
    <Thermostat>:
        temp: 0                                       #<<<<<<<<<<<<
        BoxLayout:
            orientation: 'horizontal'
            cols: 3
    
            Label:
                id: label
                font_size: "11sp"
                text: "INSIDE: {}".format(root.temp)  #<<<<<<<<<<<<
    
            Label:
                text: "More Info"
                font_size: "11sp"
    
            Button:
                text: ">"
                on_release: app.root.current= "temperature"
                size_hint_x: None
                width: 30
    
    
    
    <Temperature>:
        temp: temp_slider.value                              #<<<<<<<<<<<<
        BoxLayout:
            cols: 4
    
            Button:
                text: "<"
                on_press: app.root.current = "thermostat"
                size_hint_x: None
                width: 30
    
            Label:
                text: 'THERMOSTAT'
    
            Slider:
                id: temp_slider
                min: 40
                max: 100
                value: 40
                step: 1
    
            Label:
                id: slide_val
                text: str(root.temp)
    
    ''')
    
    
    class Thermostat(Screen):
        pass
    
    
    class Temperature(Screen):
        pass
    
    
    class Manager(ScreenManager):
        pass
    
    
    class ExampleApp(App):
        def build(self):
            return Manager()
    
    
    if __name__ == "__main__":
        ExampleApp().run()
    

    If you want to use the slider's value in your class Temperature, simply declare the property in the class:

    from kivy.properties import NumericProperty
    
    
    class Temperature(Screen):
        temp = NumericProperty()
        def __init__(self, **kwargs):
            super(Temperature, self).__init__(**kwargs)
    

    enter image description here