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

代码无语法错误但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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:45:37