点击Button退出Kivy应用触发NameError错误是什么原因?
错误原因
- KV语言有独立的作用域,默认没有导入你Python代码中定义的
ButtonApp类,所以直接在KV代码中调用ButtonApp相关属性会触发NameError未定义错误。 - 你之前尝试的几种写法本身也存在逻辑问题:
ButtonApp.stop():stop()是App类的实例方法,不能直接通过类本身调用ButtonApp().stop():该写法会实例化一个全新的App对象,再停止这个新对象,完全不会影响当前正在运行的应用ButtonApp.get_running_app().stop():本质还是KV找不到ButtonApp的定义,所以报错
解决方法
KV语言内置了app全局变量,直接指向当前正在运行的App实例,不需要额外导入任何类,只需要把按钮的on_press配置修改为on_press: app.stop()即可。
修正后完整代码
from kivy.app import App from kivy.lang import Builder from kivy.uix.floatlayout import FloatLayout kv = ''' <NewButton>: size_hint: None, None size: 100, 100 Button: text: "Exit" font_size: 20 pos: 50, 50 size_hint: None, None size: 50, 25 on_press: app.stop() ''' class NewButton(FloatLayout): def callback1(self): pass class ButtonApp(App): def build(self): Builder.load_string(kv) return NewButton() if __name__ == '__main__': ButtonApp().run()
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

