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

Kivy摄像头每秒捕获30帧报错:'float'对象无'ids'属性

问题修复方案

错误原因

你把Clock.schedule_interval作为类属性直接定义,此时capture是未绑定的类方法,调度器调用它时会把时间间隔(float类型)作为第一个参数传入,导致capture里的self变成了float对象,所以会抛出'float' object has no attribute 'ids'的错误。

修复步骤

  1. 将调度逻辑移到类的初始化方法(__init__)中,确保在实例创建完成后再绑定调度,这样capture方法能正确获取到实例的self。
  2. 修改文件名生成逻辑,避免每次捕获的图片覆盖之前的文件(比如添加时间戳或递增序号)。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:55:18