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

Kivy绘图应用保存画布生成空白黑图问题求助

Kivy绘图应用保存图像为空白黑色的解决办法

问题现象

基于Kivy官方教程修改的简易绘图应用,添加保存按钮后点击能生成image.jpg,但文件始终是空白黑色,无法保存画布上的绘制内容。

问题原因

  1. Color参数范围错误:Kivy的Color类仅接受0-1之间的浮点值,而非0-255的整数,原代码中Color(255,255,255)会被强制截断为1,虽不影响显示,但结合第二个问题会导致导出异常;
  2. 控件尺寸未适配窗口:原代码将MyPaintWidget作为子控件添加到默认尺寸为(100,100)的Widget容器中,而实际绘图操作是在整个窗口范围内进行,导致导出的是MyPaintWidget自身的小尺寸区域,而非完整绘图内容。

修复方案

  • 将Color参数改为0-1的浮点值,比如Color(1,1,1)表示白色;
  • 让MyPaintWidget占满整个窗口,可直接将其设为根控件,或给它设置size_hint=(1,1)。

修复后的完整代码

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse, Line

class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 1)  # 修正为0-1范围的白色值
            Ellipse(pos=(touch.x - 5, touch.y - 5), size=(10, 10))  # 增大圆点,提升可见性
            touch.ud['line'] = Line(points=(touch.x, touch.y), width=2)  # 增加线条宽度

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]

class MyPaintApp(App):
    def build(self):
        # 直接用MyPaintWidget作为根控件,自动占满整个窗口
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Clear', font_size=30, pos=(100, 0))
        clearbtn.bind(on_release=self.clear)
        savebtn = Button(text='Save', font_size=30)
        savebtn.bind(on_release=self.save)
        self.painter.add_widget(savebtn)
        self.painter.add_widget(clearbtn)
        return self.painter

    def save(self, obj):
        self.painter.export_as_image().save('image.jpg')

    def clear(self, obj):
        self.painter.canvas.clear()

MyPaintApp().run()

替代方案(保留原parent容器)

如果需要保留原有的parent作为根控件,只需给MyPaintWidget添加尺寸适配:

self.painter = MyPaintWidget(size_hint=(1,1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:45:29