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

Python3.7中Kivy Spinner组件运行即崩溃问题求助

解决Kivy Spinner组件的AttributeError: value问题

嘿,我帮你排查了这个Kivy Spinner的报错问题,咱们一步步来解决它:

问题根源

你遇到的AttributeError: value本质是Spinner的on_value事件绑定写法错误,lambda函数的定义不符合Kivy的事件回调规则,导致框架解析时找不到对应的value属性。另外还有个潜在的小问题是目录读取的容错性,咱们一起处理掉。

修正后的完整代码

from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.lang import Builder
from os import listdir

Builder.load_string('''
<mycls>:
    BoxLayout:
        Spinner:
            size_hint: None, None
            size: 100, 44
            pos_hint: {'center': (.5, .5)}
            text: 'Music'
            values: root.musList
            # 正确绑定on_value事件,使用Kivy事件默认传递的参数
            on_value: root.showselection(*args)
''')

class mycls(BoxLayout):
    musDir = r'C:\Users\danburnier\Desktop\PythonPrograms'
    # 增加目录存在性判断,避免因目录问题崩溃
    try:
        musList = listdir(musDir)
    except FileNotFoundError:
        musList = ["目标目录不存在"]

    # 将showselection转为类方法,确保kv能正确访问
    def showselection(self, spinner, selected_value):
        print(f"选中的Spinner实例: {spinner},选中的值: {selected_value}")

class mineapp(App):
    def build(self):
        return mycls()

if __name__ == '__main__':
    mineapp().run()

关键修改点说明

  • 修复on_value绑定:Kivy触发on_value事件时,会自动传递两个参数:控件实例(Spinner本身)和选中的value值,用*args可以直接把这两个参数传给回调函数,替代你原来错误的lambda写法。
  • 调整函数作用域:把showselection放到mycls类内部作为方法,通过root.showselection调用,避免全局函数的作用域访问问题,也更符合面向对象的开发规范。
  • 增加目录容错:用try-except捕获目录不存在的异常,给musList设置默认值,防止程序因路径错误直接崩溃。

如果你一定要用全局函数,也可以把kv里的绑定改成on_value: showselection(*args),但还是推荐用类方法的方式,代码更清晰易维护。

内容的提问来源于stack exchange,提问作者DGGB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:47:42