Передача переменных между экранами приложения kivy

Только начинаю разбираться с kivy, по итогу всё запуталось. На CalculateScreen через TextInput вводятся несколько значений, с помощью которых в методе calculations осуществляются вычисления. Сами вычисления работают корректно. Требуется передать значения переменных-результатов расчетов - day_distance, daily_consumption, gasoline_left на cоответствующие поля Label экрана ResultScreen.

Вот код:

Файл .py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty, StringProperty


class CalculateScreen(Screen):
    start_distance = ObjectProperty()
    finish_distance = ObjectProperty()
    start_gasoline = ObjectProperty()
    added_fuel = ObjectProperty()
    normal_consumption = ObjectProperty()
    
    def counting(self, start_distance, finish_distance, start_gasoline, added_fuel, normal_consumption):
        if self.added_fuel == 0:
            day_distance = str(finish_distance-start_distance)
            daily_consumption = str((int(day_distance)*normal_consumption)/100)
            gasoline_left = str(start_gasoline-float(daily_consumption))
        else:
            day_distance = str(finish_distance-start_distance) 
            daily_consumption = str((float(day_distance)*normal_consumption)/100)
            gasoline_left = str((start_gasoline+added_fuel)-float(daily_consumption))
        
    def calculations(self):
        try:
            start_distance = float(self.start_distance.text)
            finish_distance = float(self.finish_distance.text)
            start_gasoline = float(self.start_gasoline.text)
            added_fuel = float(self.added_fuel.text)
            normal_consumption = float(self.normal_consumption.text)
        except:
            start_distance = 0
            finish_distance = 0
            start_gasoline = 0
            added_fuel = 0
            normal_consumption = 0
        
        self.counting(start_distance, finish_distance, start_gasoline, added_fuel, normal_consumption)
    
    def set_values(self):
        result_screen = self.manager.get_screen("result")
        result_screen.ids.day_distance_result.text = self.day_distance
        result_screen.daily_consumption_result.text = self.daily_consumption
        result_screen.gasoline_after_result.text = self.gasoline_after
        
        
class ResultScreen(Screen):
    day_distance_result = ObjectProperty()
    daily_consumption_result = ObjectProperty()
    gasoline_after_result = ObjectProperty()
    

class Manager(ScreenManager):
    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)

class MyApp(App):
    def build(self):
        m = Manager()
        return m

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

Файл .kv

<Manager>:
    id: screen_manager
    
    screen_one: screen_one
    screen_two: screen_two
    
    CalculateScreen:
        id: screen_one
        name: "calculator"
        manager: screen_manager
    
    ResultScreen:
        id: screen_two
        name: "result"
        manager: screen_manager
        
        

<CalculateScreen>
    name: "calculator"
    
    start_distance: start_distance
    finish_distance: finish_distance
    start_gasoline: start_gasoline
    added_fuel: added_fuel
    normal_consumption: normal_consumption
    
      
    BoxLayout:
        orientation: 'vertical'
        padding: 20
        spacing: 10
        
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Километраж до выезда из гаража"
            TextInput:
                id: start_distance
        
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Километраж после возвращения"
            TextInput:
                id: finish_distance
        
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Остаток топлива"
            TextInput:
                id: start_gasoline
        
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Заправка"
            TextInput:
                id: added_fuel
        
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Расход по норме"
            TextInput:
                id: normal_consumption
    
        Button:
            text:'Рассчитать'
            on_press: root.calculations()
            on_press: root.set_values()
            on_release: root.manager.current = "result"
       
        
<ResultScreen>
    name: "result"
    
    on_enter: root.manager.get_screen("calculator").set_values()
    
    day_distance_result: day_distance_result
    daily_consumption_result: daily_consumption_result
    gasoline_after_result: gasoline_after_result
    
    
    BoxLayout:
        orientation: 'vertical'
        padding: 20
        spacing: 10
    
        BoxLayout:
            Label
                text: "Километраж за сутки"
            Label:
                text: "0"
                id: day_distance_result
        
        BoxLayout: 
            Label
                text: "Фактический расход"
            Label:
                text: "0"
                id: daily_consumption_result
    
        BoxLayout:
            Label
                text: "Остаток топлива"
            Label:
                text: "0"
                id: gasoline_after_result
        
        
        BoxLayout:
            orientation: 'horizontal'
            spacing: 10
        
            Button:
                text: 'Выйти'
            Button:
                text: 'Пересчитать'
                on_release: root.manager.current = "calculator"
        

Попытка передачи данных реализована мною тут(всё в рамках экрана CalculateScreen):

.py

    def set_values(self):
        result_screen = self.manager.get_screen("result")
        result_screen.ids.day_distance_result.text = self.day_distance
        result_screen.daily_consumption_result.text = self.daily_consumption
        result_screen.gasoline_after_result.text = self.gasoline_after

.kv


 Button:
            text:'Рассчитать'
            on_press: root.calculations()
            on_press: root.set_values()
            on_release: root.manager.current = "result"

В итоге получается это:

File "C:\Users\Anna\project\kivy-project\my.kv", line 72, in <module>
     on_press: root.set_values()
   File "mainlogic.py", line 46, in set_values
     result_screen.ids.day_distance_result.text = day_distance
 NameError: name 'day_distance' is not defined

Вопрос 1. Что не так в моей схеме передачи данных между экранами? Если можно, пусть даже на упрощенном примере, покажите, пожалуйста, как это должно работать. Вопрос 2. Не лучше ли (можно ли?) ту же функцию set_value() вызывать не на on_press кнопки как сейчас, а на on_enter при отрисовке экрана? Любые советы/замечания приветствуются, заранее благодарю за помощь.


Ответы (0 шт):