如何在Kivy的kv文件中访问MainLayout类外的类与方法?
在Kivy的kv文件中调用外部类方法的解决方案
针对你遇到的问题,这里提供几种不把方法塞进MainLayout就能在kv文件中调用外部类方法的实现方式:
方法1:通过App实例访问外部类实例
把外部类的实例绑定到App对象上,kv文件中可以通过app关键字直接访问:
修改后的main.py:
import kivy from kivy.app import App from kivy.uix.widget import Widget class MyClass: def add(self): return 1 + 1 class MainLayout(Widget): pass class MyApp(App): def build(self): # 创建外部类实例并绑定到App self.my_class = MyClass() return MainLayout() if __name__ == "__main__": MyApp().run()
对应的main.kv:
<MainLayout> GridLayout: size: root.width, root.height Button: text: "Button" on_press: print(app.my_class.add())
方法2:让MainLayout持有外部类实例
如果外部类和布局逻辑关联度较高,可以在MainLayout中持有实例,但仅做引用,不会导致代码臃肿:
修改后的main.py:
import kivy from kivy.app import App from kivy.uix.widget import Widget class MyClass: def add(self): return 1 + 1 class MainLayout(Widget): def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化外部类实例 self.my_class = MyClass() class MyApp(App): def build(self): return MainLayout() if __name__ == "__main__": MyApp().run()
对应的main.kv:
<MainLayout> GridLayout: size: root.width, root.height Button: text: "Button" on_press: print(root.my_class.add())
方法3:调用静态/类方法(无状态工具函数)
如果add()是无状态的工具方法,可以定义为静态方法,通过kv的#:import导入类后直接调用:
修改后的main.py:
import kivy from kivy.app import App from kivy.uix.widget import Widget class MyClass: @staticmethod def add(): return 1 + 1 class MainLayout(Widget): pass class MyApp(App): def build(self): return MainLayout() if __name__ == "__main__": MyApp().run()
对应的main.kv:
# 导入外部类,格式为 #:import 类名 模块名 #:import MyClass main.MyClass <MainLayout> GridLayout: size: root.width, root.height Button: text: "Button" on_press: print(MyClass.add())
内容的提问来源于stack exchange,提问作者Isaac England
相关产品推荐
相关产品推荐

