You need to enable JavaScript to run this app. Kivy开发拍照功能触发AttributeError: 'AddPhotoScreen'无capture属性
优惠活动
大模型
产品
解决方案
定价
更多

Kivy开发拍照功能触发AttributeError: 'AddPhotoScreen'无capture属性

问题根因
  • kv规则中root指代当前规则的根控件,也就是AddPhotoScreen类的实例,你并没有在AddPhotoScreen类中定义capture方法,capture方法属于独立的CameraClick类
  • Screen类没有自动调用build()方法的逻辑,你写的AddPhotoScreen.build()方法不会被Kivy框架自动执行,CameraClick实例根本没有被添加到AddPhotoScreen的组件树中,和kv里定义的布局完全无关
  • kv里定义的Camera控件id属于AddPhotoScreen的ids作用域,不在CameraClick的ids里,就算你调用到CameraClick的capture方法也会找不到camera id
修复方案1(改代码最少)

直接把capture方法定义到AddPhotoScreen类中,删除没用的CameraClick类即可:

class AddPhotoScreen(Screen):
    def capture(self):
        # 直接从当前Screen的ids里取Camera控件
        camera = self.ids['camera']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))
        print ("Photo Added")

kv文件不需要修改,原来的on_press: root.capture()可以正常运行。

修复方案2(保留CameraClick类结构)
  1. 先修改kv文件,把原来AddPhotoScreen里的布局移到CameraClick的规则里:
<AddPhotoScreen>:
    name: "addphoto"
    CameraClick: # 直接把CameraClick作为AddPhotoScreen的子控件
        id: camera_click

<CameraClick>:
    FloatLayout:
        Camera:
            id: camera
            resolution: (1280, 800)
            play: True

        GridLayout:
            cols: 1
            rows: 2
            spacing: 1
            pos_hint: {"center_x":.5, "center_y":.1}
            MDIconButton:
                icon: "camera"
                user_font_size: "64sp"
                text_color: 0,0,0,0.9
                pos_hint: {"center_x":.5, "center_y":.5}
                on_press: root.capture() # 这里的root就是CameraClick实例
            MDIconButton:
                icon: "keyboard-backspace"
                user_font_size: "64sp"
                text_color: 0,0,0,0.9
                pos_hint: {"center_x":.5, "center_y":.5}
                on_release:app.root.current = "nouvelele"
  1. 修改main.py里的AddPhotoScreen类,删掉没用的build方法:
class AddPhotoScreen(Screen):
    pass
        
class CameraClick(BoxLayout):
    def capture(self):
        camera = self.ids['camera']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))
        print ("Photo Added")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:15:04