Kivy摄像头每秒捕获30帧报错:'float'对象无'ids'属性
问题修复方案
错误原因
你把Clock.schedule_interval作为类属性直接定义,此时capture是未绑定的类方法,调度器调用它时会把时间间隔(float类型)作为第一个参数传入,导致capture里的self变成了float对象,所以会抛出'float' object has no attribute 'ids'的错误。
修复步骤
- 将调度逻辑移到类的初始化方法(
__init__)中,确保在实例创建完成后再绑定调度,这样capture方法能正确获取到实例的self。 - 修改文件名生成逻辑,避免每次捕获的图片覆盖之前的文件(比如添加时间戳或递增序号)。
修改后的完整代码
from kivy.app import App from kivy.lang import Builder from kivy.uix.boxlayout import BoxLayout from kivy.clock import Clock from datetime import datetime Builder.load_string(''' <CameraClick>: orientation: 'vertical' Camera: id: camera resolution: (640, 480) play: True ''') class CameraClick(BoxLayout): def __init__(self, **kwargs): super().__init__(**kwargs) # 实例创建后再调度,绑定当前实例的capture方法 self.event = Clock.schedule_interval(self.capture, 1 / 30.) def capture(self, dt): ''' Function to capture the images from the camera ''' # 用当前时间戳生成唯一文件名,避免覆盖 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f") filename = f"IMG_{timestamp}.png" camera = self.ids['camera'] camera.export_to_png(filename) print(f"Captured: {filename}") class TestCamera(App): def build(self): return CameraClick() TestCamera().run()
关键改动说明
- 把调度代码移到
__init__方法里,通过self.capture绑定实例方法,调度器调用时会自动把时间间隔dt作为第二个参数传入(所以capture方法需要增加dt参数)。 - 新增时间戳文件名逻辑,保证每次捕获的图片都有唯一名称,不会被覆盖。
内容的提问来源于stack exchange,提问作者JoraSN
相关产品推荐
相关产品推荐

