Kivy绘图应用保存画布生成空白黑图问题求助
Kivy绘图应用保存图像为空白黑色的解决办法
问题现象
基于Kivy官方教程修改的简易绘图应用,添加保存按钮后点击能生成image.jpg,但文件始终是空白黑色,无法保存画布上的绘制内容。
问题原因
- Color参数范围错误:Kivy的
Color类仅接受0-1之间的浮点值,而非0-255的整数,原代码中Color(255,255,255)会被强制截断为1,虽不影响显示,但结合第二个问题会导致导出异常; - 控件尺寸未适配窗口:原代码将
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
相关产品推荐
相关产品推荐

