Kivy. Проблема с предачей и отображением переменных между Screen в ScreenManager
Уже неделю бьюсь над одной проблемой, перепробовал море вариантов и не один не работает. Суть такова: приложение kivy с .kv, построено с использованием ScreenManager. Есть три класса Screen - First, Second и Result. Первый принимает данные через TextInput, вызывает второй, который принимает аналогичным образом еще набор данных, вызывает функцию обработки данных, затем вызывает третий для отображения результата, и вот здесь загвоздка - передать данные и отобразить результат с лету не удается. Единственное решение которое удалось найти - добавление дополнительной кнопки в третий класс, которая вызывает функцию из этого же класса для отображения ранее расчитаного результата. Может кто подскажет как обойтись без этого лишнего шага?
example.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
def result():
name = FirstScreen.entries + SecondScreen.entries
res = 0
for i in name:
res += i
bolwan = '''[size=20sp]Сумма данных: %s [/size]\n\n'''
mes = bolwan % (res)
return mes
class FirstScreen(Screen):
entries = []
def fetch_screen(self):
hp = []
for key in self.ids.keys():
s = self.ids[key].text
if s == '':
print("Не введено значение")
return
try:
d = float(s)
except:
print("Введено недопустимое значение")
return
else:
hp.append(d)
self.entries.extend(hp)
MyExampleApp.sm.current = 'second'
class SecondScreen(Screen):
entries = []
def fetch_screen(self):
hp = []
for key in self.ids.keys():
s = self.ids[key].text
if s == '':
print("Не введено значение")
return
try:
d = float(s)
except:
print("Введено недопустимое значение")
return
else:
hp.append(d)
self.entries.extend(hp)
mes = result()
ResultScreen().mes_f(mes)
MyExampleApp.sm.current = 'result'
class ResultScreen(Screen):
def mes_f(self, mes):
self.ids.res_lab.text = mes
class MyExampleApp(App):
sm = ScreenManager()
def quit(self):
App.get_running_app().stop()
Window.close()
def build(self):
self.sm.add_widget(FirstScreen(name='first'))
self.sm.add_widget(SecondScreen(name='second'))
self.sm.add_widget(ResultScreen(name='result'))
return self.sm
if __name__ == '__main__':
MyExampleApp().run()
myexample.kv
<MyContainer@BoxLayout>:
canvas.before:
Color:
rgba: 0, 1, 1, 0.1
Rectangle:
size: self.size
pos:self.pos
<MyLabel@Label>:
text_size: self.size
font_size: '18sp'
<FirstScreen>:
MyContainer:
orientation: 'vertical'
BoxLayout:
BoxLayout:
padding: 10, 0, 0, 0
orientation: 'vertical'
MyLabel:
text: 'Данные №1'
MyLabel:
text: 'Данные №2'
BoxLayout:
padding: 0, 0, 10, 0
orientation: 'vertical'
TextInput:
id: dn_1
TextInput:
id: dn_2
Button:
text: 'Next'
on_press: root.fetch_screen()
<SecondScreen>:
MyContainer:
orientation: 'vertical'
BoxLayout:
BoxLayout:
padding: 10, 0, 0, 0
orientation: 'vertical'
MyLabel:
text: 'Данные №3'
MyLabel:
text: 'Данные №4'
BoxLayout:
padding: 0, 0, 10, 0
orientation: 'vertical'
TextInput:
id: dn_3
TextInput:
id: dn_4
Button:
text: 'Расчитать'
on_press: root.fetch_screen()
<ResultScreen>:
MyContainer:
orientation: 'vertical'
Label:
text: 'Результаты'
font_size: '25sp'
Label:
id: res_lab
markup: True
text: ''
Button:
text: 'Выход'
on_press: app.quit(
)
Ответы (1 шт):
Проблема решена следующим образом: example.py:
...
def result():
...
mes = bolwan % (res)
# ссылка на SreenManager
sm = App.get_running_app().root
# ссылка на необходимый Screen
resultscreen = sm.get_screen('result')
# изменяем нужную метку
resultscreen.ids.res_lab.text = mes
class FirstScreen(Screen):
...
class SecondScreen(Screen):
entries = []
def fetch_screen(self):
...
self.entries.extend(hp)
result()
MyExampleApp.sm.current = 'result'
class ResultScreen(Screen):
pass
class MyExampleApp(App):
sm = ScreenManager()
def quit(self):
App.get_running_app().stop()
Window.close()
def build(self):
self.sm.add_widget(FirstScreen(name='first'))
self.sm.add_widget(SecondScreen(name='second'))
self.sm.add_widget(ResultScreen(name='result'))
return self.sm
if __name__ == '__main__':
MyExampleApp().run()