Решение
Существует два варианта решения.
Примечание:
Не рекомендуется использовать tela_two = Tela2()
, так как вы создаете другой экземпляр объекта, Tela2
, с которым не связано представление, и другие обновленные значения для атрибутов.
Вариант 1 - использование get_screen ()
В этой опции мы получаем экземпляр объекта Tela2:
, используя функцию get_screen()
, чтобы мы могли получить доступ к его методам или атрибутам, например, price
. Мы сделаем следующие улучшения:
kv файл:
- Мы называем экранами,
name: 'Tela2'
и name: 'Tela4'
для созданных объектов, Tela2:
и Tela4:
соответственно.
Фрагменты - файл kv
ScreenManager:
Tela2:
name: 'Tela2'
...
Tela4:
name: 'Tela4'
Py file
- Получить экземпляр объекта,
Tela2
, используя get_screen()
, функцию
Snippets - Py file
def whatever(self):
tela_two = self.manager.get_screen('Tela2')
self.cost_output.text = str(tela_two.price)
или
def whatever(self):
self.cost_output.text = str(self.manager.get_screen('Tela2').price)
Вариант 2 - использование идентификатора: tela2
В этой опции мы добавляем id: tela2
к созданному объекту, Tela2:
и используем ids.tela2
для доступа к его методам или атрибутам, например. price
. Мы сделаем следующие улучшения:
файл кв:
- Добавить
id: tela2
к созданному объекту, Tela2:
Фрагменты - файл kv
ScreenManager:
Tela2:
id: tela2
...
Tela4:
Py file
- Заменить
tela_two = Tela2
на tela_two = self.manager.ids.tela2
Snippets - Py file
def whatever(self):
tela_two = self.manager.ids.tela2
self.cost_output.text = str(tela_two.price)
или
def whatever(self):
self.cost_output.text = str(self.manager.ids.tela2.price)
Каждый экран по умолчанию имеет свойство manager
, которое дает вам
экземпляр ScreenManager
используется.
Пример - использование идентификатора: tela2
В следующем примере показано использование функции get_screen()
и ids.tela2
для доступа к атрибутам, определенным в объекте, Tela2
. Он также моделировал событие on_text
, вызывая self.region_define('Norte')
и self.op_dimoff()
.
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder
Builder.load_string("""
<ScreenManagement>:
Tela2:
id: tela2
name: 'Tela2'
Tela4:
name: 'Tela4'
<Tela2>:
Button:
text: 'Goto Tela4'
on_release: root.manager.current = 'Tela4'
<Tela4>:
on_pre_enter:
self.whatever()
Label:
id: cost_output
font_size: sp(50)
""")
class Tela2(Screen):
ngd = ObjectProperty(None)
def __init__(self, **kwargs):
super(Tela2, self).__init__(**kwargs)
self.price = 0.0
self.ngd = 0.0
self.price_inv = 0.0
# simulation
self.region_define('Norte')
self.op_dimoff()
def region_define(self, text):
self.inorte: float = 4.825
self.inordeste: float = 5.483
self.icentro: float = 5.082
self.isudeste: float = 4.951
self.isul: float = 4.444
self.kwh_norte: float = 0.871
self.kwh_nordeste: float = 0.308
self.kwh_centro: float = 0.290
self.kwh_sudeste: float = 0.322
self.kwh_sul: float = 0.320
if text == 'Norte':
self.irrad = self.inorte
self.kwh = self.kwh_norte
elif text == 'Nordeste':
self.irrad = self.inordeste
self.kwh = self.kwh_nordeste
elif text == 'Centro-Oeste':
self.irrad = self.icentro
self.kwh = self.kwh_centro
elif text == 'Sudeste':
self.irrad = self.isudeste
self.kwh = self.kwh_sudeste
else:
self.irrad = self.isul
self.kwh = self.kwh_sul
def op_dimoff(self):
# cálculo da Geração Mínima = (NGD/irrad)
self.gmin = float(self.ngd / self.irrad) # em W/h
# dimensionamento potência do inversor
self.pot_seg = self.gmin * 1.3
self.inv = (600, 1000, 1500, 2000, 3000)
self.pri_inv = (1434, 1852.2, 1924, 2604, 3899)
self.x = 0
for self.x in range(0, len(self.inv)):
if self.pot_seg <= self.inv[int(self.x)]:
self.pot_inv = self.inv[int(self.x)]
self.price_inv = self.pri_inv[int(self.x)]
break
else:
self.x += 1
self.price = float((int(self.ngd) * 0.87 * 1.75) + self.price_inv)
class Tela4(Screen):
def whatever(self):
# Each screen has by default a roperty manager that gives you the instance of the ScreenManager used.
self.ids.cost_output.text = str(self.manager.ids.tela2.price)
print(f"tela2.irrad={self.manager.ids.tela2.irrad}")
print(f"tela2.kwh={self.manager.get_screen('Tela2').kwh}")
class ScreenManagement(ScreenManager):
pass
class TestApp(App):
def build(self):
return ScreenManagement()
if __name__ == "__main__":
TestApp().run()
выход