You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:25:39