范围相关变量的麻烦

时间:2018-06-19 14:21:01

标签: python python-3.x kivy

您好,我正在用Python开发一个简单的界面应用程序,该应用程序将使清单表单可以轻松,直观地输入到访问数据库中。

我目前具有以下功能:

def spawnerror(self, errormsg):
    self.running = False
    content = Button(text=errormsg)
    popup = Popup(title='ERROR!', content=content, auto_dismiss=False)
    content.bind(on_press=popup.dismiss)
    popup.open()

我已经完成了适当的错误处理,并且应用程序按预期使用了此功能。例如,如果某人未在必填字段中输入,它将调用此函数并生成带有错误的错误页面并通知用户。

我遇到的问题是,它需要将类变量 running 设置为False,因为在主函数“提交”的末尾它会检查该变量以及self.running == False,那么它需要跳过访问数据库中数据输入的执行。

该函数为什么不将运行的类变量设置为false?

1 个答案:

答案 0 :(得分:1)

解决方案-使用App.get_running_app()

在示例中,类属性running被定义为BooleanProperty。在spawnerror()函数中,它使用App.get_running_app()函数获取App类的实例,然后访问变量running

注意

如果正在运行 spawnerror()函数和 submit()函数位于不同的类中,则计算出这些类之间的关系并通过他们之间的直接参考。

示例

main.py

from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty, ObjectProperty


class RootWidget(BoxLayout):
    instance = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        self.instance = App.get_running_app()
        self.spawnerror('Testing')

    def spawnerror(self, errormsg):
        self.instance.running = False
        content = Button(text=errormsg)
        popup = Popup(title='ERROR!', content=content, auto_dismiss=False)
        content.bind(on_press=popup.dismiss)
        popup.open()


class TestApp(App):
    running = BooleanProperty(True)

    def build(self):
        print("\nbuild:")
        self.display_attributes()
        return RootWidget()

    def on_stop(self):
        print("\non_stop:")
        self.display_attributes()

    def display_attributes(self):
        print("\tApp.running =", self.running)


if __name__ == "__main__":
    TestApp().run()

输出

Img01