我正在尝试在以前保存的画布纹理的顶部渲染一些标签。当我首先将小部件渲染到Fbo而不将其绘制到屏幕上时,我得到一个空白输出。我相信这是在下面的代码段中复制的,从on_start调用的save_file会错误地写入文件,但是如果从按钮按下调用了相同的逻辑,则会保存正确呈现的小部件的文件。
有没有一种方法可以将小部件呈现给Fbo,而不呈现给画布?
我是否需要在小部件上调用更新或绘制命令? (notshown.texture似乎为None,添加notshown.canvas.draw()似乎是由于没有堆栈跟踪或原因而崩溃的?)
from kivy.app import App
from kivy.factory import Factory
class TestApp(App):
def build(self, *kwargs):
layout = Factory.BoxLayout()
test1 = Factory.Button(text='test1', size_hint=(None,None), size=(200,200))
test1.bind(on_press=self.save_file1)
layout.add_widget(test1)
test2 = Factory.Button(text='test2', size_hint=(None,None), size=(200,200))
test2.bind(on_press=self.save_file2)
layout.add_widget(test2)
return layout
def save_file1(self, widget, value=False):
fbo = Factory.Fbo(size=widget.size, with_stencilbuffer=True)
fbo.add(widget.canvas)
fbo.draw()
fbo.texture.save('C:/Temp/test1.png', flipped=True)
def save_file2(self, widget, value=False):
notshown = Factory.Button(text='notshown', size_hint=(None,None), size=(200,200))
fbo = Factory.Fbo(size=notshown.size, with_stencilbuffer=True)
fbo.add(notshown.canvas)
fbo.draw()
fbo.texture.save('C:/Temp/test2.png', flipped=True)
TestApp().run()
答案 0 :(得分:0)
根据约翰·安德森(John Anderson)的输入,问题在于在尝试保存纹理之前,没有给应用程序足够的时间来渲染框架。
使用Clock.schedule_once等待下一帧意味着对小部件纹理的export_to_png或所有其他使用都成功了,几乎没有大惊小怪。
img = Factory.FinalImage(imagedata, size_hint=(None,None), size=imagedata.size)
Clock.schedule_once( lambda x: img.export_to_png(filename=imagename) )