2016-06-11 73 views
0

我最近了解了Python框架kivy并开始遵循the simple paint app tutorial。现在我想保存绘制为.png文件的内容,而不是彩色点,它只导出黑色背景。Export_to_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

弄清楚什么是错的最好方法是使用:https://kivy.org/docs/api-kivy.modules.inspector.html#module-kivy.modules.inspector,你可以激活它正如它在此处所述:https://kivy.org/docs/api-kivy.modules.html#activating-a-module,通过在'[modules]'下的'config.ini'文件中添加'inspector ='。 – fins

回答

1

你缺少一两件事 - Widget不会自动设置其大小和位置,以全尺寸Window,但只能默认的,即pos = [0, 0]size = [100, 100]因为Window != Layout,甚至将它添加到的东西,不从Layout韩元继承(Widget != Layout),你可以很容易地看到,如果你看到一个保存PNG(太小)。如果你打算只停留在PC上,只使用默认Window大小

self.painter=MyPaintWidget(size=[800,600]) 

会让你的工作。如果不是,则使用:

from kivy.core.window import Window 
self.painter=MyPaintWidget(size=Window.size) 

这似乎更实用,但你仍然不在那里。一个最佳的解决方案是使用Layout,它为你做这些事情,例如BoxLayout,GridLayoutsome others

并为您提供完美的解决方案是在Layout,当其被置于不会采取整个画布的截图使用StencilView,但只有一部分,你会觉得它会采取即部分大小为Widget本身就放置在其位置上。

尝试绘制红色框外。 Inspector将为您提供以颜色和其他功能显示小部件,所以一定要按照评论中提到的那样进行尝试。

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.core.window import Window 
from kivy.uix.stencilview import StencilView 
from kivy.graphics import Color, Ellipse, Line, Rectangle 

class MyPaintWidget(StencilView): 
    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(size=[i/2.0 for i in Window.size]) 
     with self.painter.canvas: 
      Color(1, 0, 0, 0.3) 
      Rectangle(pos=self.painter.pos, size=self.painter.size) 
     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") 
MyPaintApp().run()