Как передать переменные между функциями классов? - PullRequest
0 голосов
/ 24 мая 2019

Ну, мне нужно получить переменную price для передачи в функцию Tela 4 whatever.Я очень плохо знаком с Python и понятия не имею, как это сделать, хотя я представляю, что это довольно просто

Вот так выглядит код прямо сейчас, не стесняйтесь добавлять предложения о том, как его улучшить.

class Tela2(Screen):
    def op_dimoff(self):
        self.price = float((int(self.ngd) * 0.87 * 1.75) + self.price_inv)

class Tela4 (Screen):
    def whatever(self):
        tela_two = Tela2
        self.cost_output.text = str(tela_two.price)

Значение 'cost_output' относится к ярлыку kivy


Обновление:

Я думаю, что способ @slackmart сделал это правильно, но все же яне могу получить желаемый результат.Я получаю сообщение об ошибке AttributeError: 'Tela2' object has no attribute 'irrad' (извините, я не опубликовал более полную версию кода, это мой первый вопрос здесь, и я боялся опубликовать длинный вопрос)

Вот как сейчас работает код, есливы, ребята, могли бы помочь мне найти решение:

class Tela2(Screen):

   ngd = ObjectProperty()

   def __init__(self, **kwargs):
       super(Tela2, self).__init__(**kwargs)
       self.price = 0.0
       self.ngd = 0.0
       self.price_inv = 0.0


   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)

Примечания:

region_define - это on_text функция Kivy Spinner

1 Ответ

0 голосов
/ 24 мая 2019

Решение

Существует два варианта решения.

Примечание:

Не рекомендуется использовать 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)

Kivy ScreenManager »менеджер свойств по умолчанию

Каждый экран по умолчанию имеет свойство 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()

выход

Result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...