如何导入并通过关键字参数实例化Python KivyMD自定义类?
问题解决方案
1. 解决空白窗口+界面延迟显示问题
这个问题几乎都是重复启动App实例导致的:
- 检查自定义类的kv文件,绝对不能包含
App().run()这类代码,kv文件只负责定义控件样式规则,不要写启动逻辑。 - 确保只有调用代码里的主App是唯一启动入口,不要在自定义类的Python文件里调用
run()。
2. 实现关键字参数实例化自定义类
要让自定义类支持关键字参数,必须完成以下两步:
步骤1:在Python类中声明可绑定属性
from kivymd.uix.card import MDCard from kivy.properties import StringProperty, NumericProperty from kivy.lang import Builder Builder.load_file("my_tile_item.kv") class MyTileItem(MDCard): # 声明需要通过关键字传参的属性,比如文本、高度等 tile_text = StringProperty("默认文本") tile_height = NumericProperty(100) def __init__(self, **kwargs): # 必须把kwargs传递给父类的__init__方法 super().__init__(**kwargs)
步骤2:在kv文件中绑定这些属性
<MyTileItem>: size_hint_y: None height: root.tile_height # 绑定Python类的高度属性 padding: 12 MDLabel: text: root.tile_text # 绑定Python类的文本属性
步骤3:调用时直接传关键字参数
from kivymd.app import MDApp from my_tile_item import MyTileItem from kivymd.uix.boxlayout import MDBoxLayout class MainApp(MDApp): def build(self): layout = MDBoxLayout(orientation="vertical", padding=20) # 直接用关键字参数实例化自定义类 my_tile = MyTileItem(tile_text="我的自定义Tile", tile_height=120) layout.add_widget(my_tile) return layout if __name__ == "__main__": MainApp().run()
3. 解决关闭窗口时的Shader IndexError
这个错误是多App实例导致的资源释放冲突,按以下步骤修复:
- 关闭所有Python相关进程,彻底清理残留的窗口实例。
- 确保整个项目中只有一处
App().run()调用(即主程序入口)。 - 不要在自定义类的初始化或kv文件中触发任何App启动逻辑。
内容的提问来源于stack exchange,提问作者Aaron Jones
相关产品推荐
相关产品推荐

