我最近了解了Python框架kivy并开始关注the simple paint app tutorial。现在我想保存绘制为.png文件的内容,但不是彩色圆点,而是只导出黑色背景。
这是我的代码示例:
import kivy
kivy.require("1.9.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):
color=(0,0,1)
with self.canvas:
Color(*color)
d=30.
Ellipse(pos=(touch.x-d/2., touch.y-d/2.), size=(d,d))
class MyPaintApp(App):
def build(self):
parent=Widget()
self.painter=MyPaintWidget()
ssbtn=Button(text='Save')
ssbtn.bind(on_release=self.save_screenshot)
parent.add_widget(self.painter)
parent.add_widget(ssbtn)
return parent
def save_screenshot(self,obj):
self.painter.export_to_png("screenshot.png")
if __name__ == '__main__':
MyPaintApp().run()
我做错了什么?谢谢你的帮助。
答案 0 :(得分:1)
您遗漏了一件事 - Widget
不会自动将其大小和位置设置为整个Window
尺寸,而只会设置为默认值pos = [0, 0]
size = [100, 100]
,因为{ {1}}甚至将其添加到不会从Window != Layout
继承的内容中也不会使其变得更好(Layout
),如果你看起来那个保存的png,你就可以轻松看到它小)。
Widget != Layout
如果您打算只使用电脑并且只使用默认的self.painter=MyPaintWidget(size=[800,600])
尺寸,将为您完成工作。如果没有,请使用:
Window
这似乎更实用,但你仍然不在那里。最佳解决方案是使用from kivy.core.window import Window
self.painter=MyPaintWidget(size=Window.size)
为您执行这些操作,例如Layout
,BoxLayout
或some others。
对于你来说,一个完美的解决方案是在GridLayout
中使用StencilView
,放置时不会截取整个画布的截图,而只会截取您认为的部分它将采取大小为Layout
本身放置在其位置的部分。
尝试在红色框外绘图。 Inspector将为您提供颜色和其他功能的小部件,因此请务必按照评论中的说明进行尝试。
Widget