You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:54:03