Kivy Popup 无法访问 root 方法

Kivy Popup not able to access root method

我是这里的新手,如果我没有遵循正确的程序,请随时纠正我。

我有一个会打开弹出窗口的 Kivy 应用程序。在弹出窗口中,我可以输入 2 个数字,然后单击应添加 2 个数字的添加按钮。我收到一条错误消息,说 "AttributeError: 'CustomPopup' object has no attribute 'addNum'"

为什么会这样?

test.py file

import kivy
kivy.require('1.9.1') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty

class CustomPopup(Popup):
    pass

class MyStuff(BoxLayout):

    num1 = StringProperty
    num2 = StringProperty
    answer = ''

    def openPopup(self):
        the_popup = CustomPopup()
        the_popup.open()

    def addNum(self):
        self.answer = str(int(self.num1) + int(self.num2))

class MyStuffApp(App):

    def build(self):
        return MyStuff()

if __name__ == '__main__':
    MyStuffApp().run()

mystuff.kv 文件

#: import main test

<MyStuff>:
    orientation: 'vertical'
    spacing: 5
    padding: 5


    Button:
        text: 'Change numbers'
        on_press: root.openPopup()
        font_size: 50

    Label:
        text: root.answer


<CustomPopup>:
    size_hint: .5, .5
    auto_dismiss: False
    title: 'Addition'
    num1: number2
    num2: number2

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: '1st number'

        TextInput:
            id: number1

        Label
            text: '2nd number'

        TextInput
            id: number2

        Button:
            text: 'Add'
            on_press: root.addNum()

首先,要访问addNum,您必须从kv 部分调用app.root.addNum。 您还必须发送要添加的值,即您在文本框中输入的文本:(number1.text, number2.text)。 所以 运行 代码可能是这样的:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup

Builder.load_string("""
<MyStuff>:
    orientation: 'vertical'
    spacing: 5
    padding: 5
    Button:
        text: 'Change numbers'
        on_press: root.openPopup()
        font_size: 50

    Label:
        text: root.answer


<CustomPopup>:
    size_hint: .5, .5
    auto_dismiss: False
    title: 'Addition'
    num1: number2
    num2: number2

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: '1st number'

        TextInput:
            id: number1

        Label
            text: '2nd number'

        TextInput
            id: number2

        Button:
            text: 'Add'
            on_press: app.root.addNum(number1.text, number2.text)
""")


class CustomPopup(Popup):
    pass


class MyStuff(BoxLayout):

    # num1 = StringProperty()
    # num2 = StringProperty()
    answer = ''

    def openPopup(self):
        the_popup = CustomPopup()
        the_popup.open()

    def addNum(self, *args):
        # self.answer = str(int(self.num1) + int(self.num2))
        self.answer = str(int(args[0]) + int(args[1]))
        print(self.answer)


class MyStuffApp(App):

    def build(self):
        return MyStuff()


if __name__ == '__main__':
    MyStuffApp().run()

如果您在某处有对 class 的引用,则可以访问 MyStuff 中的方法。
当您执行 root.addNum() 时,您尝试访问 CustomPopup 中的方法,在这种情况下它是根。
所以在这种情况下我要做的是将 MyStuff 定义为 App class、(self.ms = MyStuff()) 的属性。这样你就可以通过 app.ms.addNum()
kv 中访问它 您还需要将数字传递给 addNum

在 py.:

class MyStuff(BoxLayout):

    answer = ''

    def openPopup(self):
        the_popup = CustomPopup()
        the_popup.open()

    def addNum(self, num1, num2):
        self.answer = str(int(num1) + int(num2))

class MyStuffApp(App):

    def build(self):
        self.ms = MyStuff()
        return self.ms

并以 kv 为单位:

    Button:
        text: 'Add'
        on_press: app.ms.addNum(number1.text, number2.text)