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

如何在Kivy/KivyMD中调用自定义函数,点击按钮时报NameError怎么解决?

问题根因

  • KV语言的执行作用域无法直接访问Python全局空间定义的函数,仅能调用当前控件方法、所属页面(root)方法、或者App实例的方法
  • 你写的全局verified_Login函数内部引用的root变量没有明确指向,就算函数能被调用也会触发二次报错
  • 代码中额外创建的sm ScreenManager实例没有实际使用,运行时生效的是KV字符串里定义的ScreenManager

修复后完整代码

from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen, ScreenManager

txtuser = 'Root'

screen_helper = """
ScreenManager:
    LoginScreen:
    ProfileScreen:


<LoginScreen>:
    name: 'login'
    MDRectangleFlatButton:
        text: 'Profile'
        pos_hint: {'center_x':0.5,'center_y':0.5}
        on_press: app.verified_Login()
<ProfileScreen>:
    name: 'profile'
    MDLabel:
        text: 'Test'
        halign: 'center'

    MDRectangleFlatButton:
        text: 'Back'
        pos_hint: {'center_x':0.5,'center_y':0.2}
        on_press: root.manager.current = 'login'

"""

class LoginScreen(Screen):
    pass

class ProfileScreen(Screen):
    pass

class DemoApp(MDApp):
    def verified_Login(self):
        if txtuser == 'Root':
            # self.root就是KV里定义的ScreenManager实例
            self.root.current = 'profile'
        else:
            print("oi")

    def build(self):
        screen = Builder.load_string(screen_helper)
        return screen

DemoApp().run()

关键修改说明

  • 把verified_Login函数移到DemoApp类中作为实例方法,KV里通过app.verified_Login()就可以正常调用
  • 方法内部通过App实例的root属性获取全局ScreenManager,直接修改current属性实现页面跳转
  • 删除了冗余的全局ScreenManager实例创建代码,避免资源浪费

内容的提问来源于stack exchange,提问作者Tio Mob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 13:54:04