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类结构)
- 先修改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"
- 修改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
相关产品推荐
相关产品推荐

