Как передать переменные между экранами (классами) в Kivy? - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю программу, которая позволяет мне использовать поисковые машины wolframalpha и wikipedia и все, что я хочу среди прочего.Моя проблема в том, что я не могу передать свою переменную ответа в экран ответов с экрана вопроса.

На сайте уже есть сообщения об этом, однако я подробно их просмотрел и ни один из них не показалсячтобы исправить мою проблему, он просто выдал другую ошибку.Если бы кто-нибудь мог помочь мне объяснить, что не так, это было бы очень признательно

Я пробовал так много разных вещей, что я не знаю, пропускаю ли я простую ошибку или нет.

Builder.load_string("""
<RootWidget>:
    QIPA:
        id:main
        name: "mainprogramme"
    QIPA_output:
        id:output
        name: "answer_screen"

<QIPA>:

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            size: root.size
            spacing: 20
            padding: 20
            Label:
                text: "Hello, I am QIPA, your virtual assistant. How may I be of service?"
                font_size: "25sp"
            TextInput:
                id:question
                multiline: False
        BoxLayout:
            Button:
                text: "back"
                font_size: "25sp"



<QIPA_output>:

    BoxLayout:
        orientation: 'vertical'
        spacing: 20
        padding: 20
        Label:
            id: output
            text: root.answer
            font_size: "10sp"
        Button:
            text: "back"
            size_hint: 1,.3
            font_size: "25sp"
            on_press:root.BacktoMainProgramme()
""")

class QIPA(Screen):
    def __init__(self, **kwargs):
        super(QIPA, self).__init__(**kwargs)
        Window.bind(on_key_down=self._on_keyboard_down)

    def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
        if keycode == 40:  # 40 - Enter key pressed
            self.OnEnter()

    def OnEnter(self):
        input = self.ids.question.text
        input = input.lower()


        try:
            #wolframalpha
            app_id = "G6YEVU-LJTJ5ETLHV"
            client = wolframalpha.Client(app_id)

            res = client.query(input)
            answer = (next(res.results).text)
            self.manager.current = "answer_screen"

            print answer
        except:
            #wikipedia
            wikipedia.set_lang("en")
            answer = wikipedia.summary(input, sentences=3)
            self.manager.current = "answer_screen"

            global answer



class QIPA_output(Screen):
    answer = StringProperty()
    answer = QIPA.OnEnter.answer
    def BacktoMainProgramme(self):
        self.manager.current = "mainprogramme"

Это упрощенная версия моего кода, я получаю ошибки

AttributeError: 'QIPA_output' object has no attribute 'answer' or <bound method QIPA_output.answer of <Screen name=">> or  Traceback (most recent call last)

в зависимости от того, что я пытался сделать с моим кодом

1 Ответ

0 голосов
/ 04 апреля 2019

Чтобы получить доступ к атрибуту класса, answer, объявленному в class QIPA_output() из class QIPA(), используйте ids, которые были добавлены в файл kv.

Метод OnEnter ()

  • Заменить answer на self.manager.ids.output.answer
  • Удалить global answer

Класс QIPA_output

  • Удалить answer = QIPA.OnEnter.answer

Фрагменты

    def OnEnter(self):
        input = self.ids.question.text
        input = input.lower()

        try:
            # wolframalpha
            app_id = "G6YEVU-LJTJ5ETLHV"
            client = wolframalpha.Client(app_id)

            res = client.query(input)
            self.manager.ids.output.answer = (next(res.results).text)

            print(f'answer={self.manager.ids.output.answer}')
        except:
            # wikipedia
            wikipedia.set_lang("en")
            self.manager.ids.output.answer = wikipedia.summary(input, sentences=3)
        self.manager.current = "answer_screen"


class QIPA_output(Screen):
    answer = StringProperty('')

    def BacktoMainProgramme(self):
        self.manager.current = "mainprogramme"
...