添加Spinner组件后Kivy(2.1.0)应用启动崩溃问题求助
Kivy 2.1.0 添加Spinner组件后启动崩溃问题解决
问题场景
使用Kivy 2.1.0开发应用时,添加Spinner组件后应用启动即崩溃,移除该组件则可正常运行。
kv文件代码
<GridLayout> cols: 2 rows: 8 Label: text: "name:" row: 0 col: 0 TextInput: id: name multiline: False row:0 col:1 on_text: if len(self.text.strip()) >= 31: self.text = self.text[0:30] Label: text: "description:" row: 1 col: 0 TextInput: id: description multiline: False row:1 col:1 on_text: if len(self.text.strip()) >= 100: self.text = self.text[0:99] Spinner: text: "hi" values: ("hi1","h12")
Python文件代码
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.textinput import TextInput from kivy.uix.button import Button from kivy.uix.spinner import Spinner class SkinAssent(App): def __init__(self, **kwargs): super(SkinAssent, self).__init__(**kwargs) def build(self): return GridLayout() def main(): SkinAssent().run() if __name__ == '__main__': main()
错误信息
File "C:\Users\4myrc\AppData\Local\Programs\Python\Python310\lib\site-packages\kivy\lang\builder.py", line 558, in _apply_rule assert(rule not in self.rulectx) AssertionError
问题原因
直接在kv文件中为系统内置的GridLayout类定义规则,当Python代码返回GridLayout实例时,Kivy会尝试多次应用该规则,导致规则上下文冲突,触发断言错误。Spinner组件的存在会触发Kivy对布局规则的重复解析,从而暴露这个问题。
解决方案
自定义一个继承自GridLayout的子类,在kv文件中针对该子类编写规则,避免与系统内置类的规则冲突。
修改后的Python代码
from kivy.app import App from kivy.uix.gridlayout import GridLayout from kivy.uix.textinput import TextInput from kivy.uix.button import Button from kivy.uix.spinner import Spinner # 自定义GridLayout子类 class MyGridLayout(GridLayout): pass class SkinAssent(App): def __init__(self, **kwargs): super(SkinAssent, self).__init__(**kwargs) def build(self): return MyGridLayout() # 返回自定义子类实例 def main(): SkinAssent().run() if __name__ == '__main__': main()
修改后的kv文件代码
<MyGridLayout> # 针对自定义子类编写规则 cols: 2 rows: 8 Label: text: "name:" row: 0 col: 0 TextInput: id: name multiline: False row:0 col:1 on_text: if len(self.text.strip()) >= 31: self.text = self.text[0:30] Label: text: "description:" row: 1 col: 0 TextInput: id: description multiline: False row:1 col:1 on_text: if len(self.text.strip()) >= 100: self.text = self.text[0:99] Spinner: text: "hi" values: ("hi1","h12")
内容的提问来源于stack exchange,提问作者myrccar
相关产品推荐
相关产品推荐

