Kivy保存小部件但未绘制将导致空白Fbo

时间:2019-02-11 02:26:51

标签: kivy

我正在尝试在以前保存的画布纹理的顶部渲染一些标签。当我首先将小部件渲染到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()

1 个答案:

答案 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) )