【问题标题】:How to pass variables between screens(classes) in Kivy?如何在 Kivy 的屏幕(类)之间传递变量?
【发布时间】:2019-04-03 17:51:58
【问题描述】:

我正在创建一个程序,它可以让我使用 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)

取决于我尝试用我的代码做什么

【问题讨论】:

标签: python kivy kivy-language


【解决方案1】:

为了访问类属性,answerclass QIPA() 中声明的 answer,请使用在 kv 文件中添加的 ids

方法 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"

【讨论】:

  • 成功了!非常感谢您,非常感谢您的详细解释。如果可以的话,我会投票,但不幸的是我没有足够的声誉
  • “如果你想说“谢谢”,请接受那个人的回答。” What should I do when someone answers my question?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多