Передача переменных между экранами приложения 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 при отрисовке экрана? Любые советы/замечания приветствуются, заранее благодарю за помощь.