代码无语法错误但Kivy自拍应用窗口仅显示黑屏求助
Kivy自拍应用黑屏问题
我是Kivy初学者,开发了一款自拍应用,代码无语法错误,理论上应正常运行。但运行时仅创建窗口却无法加载任何内容,显示为空白黑屏。
代码示例
from kivy.app import App from kivy.uix.camera import Camera from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout ind = 0 class applic(App): def make_screen(self): self.camera = Camera self.camera.resolution = (810, 810) butt = Button(text="CLICK ME!") butt.size_hint = (.6, .3) butt.pos_hint = {'x': .25, 'y': .25} butt.bind(on_press=self.save_selfie()) screen = BoxLayout() screen.add_widget(self.camera) screen.add_widget(butt) return screen def save_selfie(self, *args): global ind ind += 1 print("success") self.camera().export_to_png(f"picture{ind}.png") if __name__=='__main__': applic().run()
运行日志
[INFO ] [Window ] Provider: sdl2 [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] GLEW initialization succeeded [INFO ] [GL ] Backend used <glew> [INFO ] [GL ] OpenGL version <b'4.4.0 - Build 20.19.15.5058'> [INFO ] [GL ] OpenGL vendor <b'Intel'> [INFO ] [GL ] OpenGL renderer <b'Intel(R) HD Graphics 5500'> [INFO ] [GL ] OpenGL parsed version: 4, 4 [INFO ] [GL ] Shading version <b'4.40 - Build 20.19.15.5058'> [INFO ] [GL ] Texture max size <16384> [INFO ] [GL ] Texture max units <32> [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [Base ] Start application main loop
问题原因及修复方案
你的代码存在三个关键错误,导致界面黑屏且功能失效:
Camera未实例化:你直接将
Camera类赋值给self.camera,而非创建实例。Kivy布局需要添加实例化的Widget,不是类本身。
修复:self.camera = Camera(resolution=(810, 810)),直接实例化并传入分辨率参数。按钮绑定错误:
butt.bind(on_press=self.save_selfie())中直接调用了方法,而非传递方法引用。这会导致启动时就执行一次save_selfie,且绑定失效。
修复:butt.bind(on_press=self.save_selfie),去掉括号,传递方法对象。保存照片时重复实例化Camera:
self.camera().export_to_png(...)会创建新的Camera实例,而非使用当前界面的相机。
修复:self.camera.export_to_png(f"picture{ind}.png"),直接调用已实例化相机的方法。
另外,Kivy应用的标准入口方法是build(),而非自定义的make_screen,规范写法能确保应用生命周期正确执行。
修复后的完整代码
from kivy.app import App from kivy.uix.camera import Camera from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout ind = 0 class applic(App): def build(self): self.camera = Camera(resolution=(810, 810)) butt = Button(text="CLICK ME!") butt.size_hint = (.6, .3) butt.pos_hint = {'x': .25, 'y': .25} butt.bind(on_press=self.save_selfie) screen = BoxLayout() screen.add_widget(self.camera) screen.add_widget(butt) return screen def save_selfie(self, *args): global ind ind += 1 print("success") self.camera.export_to_png(f"picture{ind}.png") if __name__=='__main__': applic().run()
内容的提问来源于stack exchange,提问作者anothaone
相关产品推荐
相关产品推荐

