如何在Kivy/KivyMD中调用自定义函数,点击按钮时报NameError怎么解决?
问题根因
- KV语言的执行作用域无法直接访问Python全局空间定义的函数,仅能调用当前控件方法、所属页面(root)方法、或者App实例的方法
- 你写的全局
verified_Login函数内部引用的root变量没有明确指向,就算函数能被调用也会触发二次报错 - 代码中额外创建的
smScreenManager实例没有实际使用,运行时生效的是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
相关产品推荐
相关产品推荐

