Kivy添加Camera、Button组件后控件不显示仅黑屏如何解决
故障排查与修复
你的代码存在4处直接导致异常的问题,按影响优先级排序:
- App类的UI构建入口方法名错误:Kivy框架要求App子类必须重写
build()方法返回根控件,你写的make()方法不会被框架自动调用,你定义的相机、按钮、布局根本没有被挂载到应用窗口上,这是黑屏、控件不显示的核心原因。 - 按钮事件绑定写法错误:
obj_button.bind(on_press = self.selfie_take())这行代码给函数加了调用括号,会在程序启动阶段直接执行一次拍照逻辑,而不是把函数绑定到按钮点击事件上,后续点击按钮不会有任何响应。正确写法是传入函数本身,不要加括号。 - 相机采集未显式启动:部分平台下Kivy的Camera控件不会自动开启画面采集,需要显式指定
play=True参数,否则控件加载后只会显示黑屏无画面。 - 冗余导入:你导入了
cv2模块但全程没有调用,会增加不必要的启动加载开销,直接删除该行导入即可。 - 布局逻辑优化:默认BoxLayout为水平排布,你当前先添加按钮再添加相机会让两个控件左右分栏显示,如果要实现相机预览在上、拍照按钮在下的常规自拍应用布局,给BoxLayout传入
orientation='vertical'参数,同时调整按钮和相机的添加顺序即可。
修复后完整可运行代码
from kivy.app import App from kivy.uix.camera import Camera from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button class selfie_app(App): def build(self): # 初始化相机时显式开启采集,设置分辨率 self.obj_camera = Camera(play=True, resolution=(810, 810)) # 初始化拍照按钮 obj_button = Button( text="点击拍照", size_hint=(.5, .2), pos_hint={'x': .25, 'y': .15} ) # 绑定点击事件,注意不要给函数加调用括号 obj_button.bind(on_press=self.selfie_take) # 垂直布局,先加相机预览、再加按钮 obj_layout = BoxLayout(orientation='vertical') obj_layout.add_widget(self.obj_camera) obj_layout.add_widget(obj_button) return obj_layout def selfie_take(self, *args): print("自拍保存成功") # 导出当前帧为PNG图片 self.obj_camera.export_to_png('./demo_file.png') if __name__ == '__main__': selfie_app().run()
额外排查提示
如果运行后相机位置依旧黑屏,优先检查两点:
- 系统是否给当前运行程序的终端/IDE开放了摄像头权限
- 摄像头是否被其他视频会议、直播类程序占用
内容的提问来源于stack exchange,提问作者Ahmed el-Sinousy
相关产品推荐
相关产品推荐

