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
相关产品推荐
相关产品推荐

