如何在Kivy文件中访问类内部函数里声明的变量
KivyMD访问类方法内变量的实现方案
函数内部定义的Object_name属于Python局部变量,仅在函数运行时生效,运行结束后会被自动回收,且默认不对外暴露,因此你之前尝试的app.a_function().App_name这类写法都无法生效。
下面是三种常用的正确实现方式:
方式1:方法直接返回目标值
如果该变量仅需要在调用方法时获取最新值,直接让方法返回该变量即可:
修改后Python代码
from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout class MainScreen(MDBoxLayout): pass class MainApp(MDApp): App_Name = "App Example" def a_function(self): Object_name = "this is a name" # 新增返回语句 return Object_name MainApp.run()
对应KV代码
MainScreen: <MainScreen>: MDLabel: # 直接调用方法获取返回值 text: app.a_function()
方式2:将变量转为App实例属性
如果该变量需要在方法执行后长期保留、供全局访问,将变量挂载到App实例上即可,后续可以和类属性App_Name一样直接访问:
修改后Python代码
from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout class MainScreen(MDBoxLayout): pass class MainApp(MDApp): App_Name = "App Example" # 建议先给属性赋初始值,避免KV加载时方法还没执行报错 Object_name = "" def a_function(self): # 赋值给实例属性 self.Object_name = "this is a name" MainApp.run()
对应KV代码
MainScreen: <MainScreen>: MDLabel: # 直接访问实例属性 text: app.Object_name
方式3:方法内主动更新UI控件值
如果变量是在特定触发事件(比如按钮点击、接口请求完成)后才生成,也可以在方法内直接获取UI控件赋值,无需KV绑定:
修改后Python代码
from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout class MainScreen(MDBoxLayout): pass class MainApp(MDApp): App_Name = "App Example" def a_function(self): Object_name = "this is a name" # 主动给指定ID的Label赋值 self.root.ids.name_label.text = Object_name MainApp.run()
对应KV代码
MainScreen: <MainScreen>: MDLabel: # 给Label设置id供Python侧获取 id: name_label
内容的提问来源于stack exchange,提问作者Andrés Rodriguez
相关产品推荐
相关产品推荐

