我正在使用Kivy开发一种科学的可视化工具,在其中我可以向用户显示一组2D数据。本质上,我使用my_texture = Texture.create(size=(my_data_x, my_data_y))
之类的东西来创建与数据集相同大小的纹理。我用my_texture.blit_buffer(Data_set)
将它涂在画布上并显示出来,效果很好。问题是:我希望允许用户能够在程序运行时更改数据集的大小。由于数据大小在变化,因此我需要一个具有新大小的纹理。我尝试将my_texture
变量重新分配给新创建的纹理,但是屏幕上实际显示的是更改之前的纹理。
所以我的问题是:是否有一种方法可以在我的程序已经运行之后适当地创建纹理并使它们显示在画布上,还是必须始终在启动时生成纹理?另外,有什么方法可以重塑已经存在的纹理?
答案 0 :(得分:0)
如果OpenGL上下文丢失,则必须重新加载Texture。贴图 具有源的文件会自动重新加载,但会生成 纹理必须由用户重新加载 。
使用Texture.add_reload_observer()添加一个重新加载函数 将在需要时自动调用:
def __init__(self, **kwargs): super(...).__init__(**kwargs) self.texture = Texture.create(size=(512, 512), colorfmt='RGB', bufferfmt='ubyte') self.texture.add_reload_observer(self.populate_texture) # and load the data now. self.cbuffer = '\x00\xf0\xff' * 512 * 512 self.populate_texture(self.texture) def populate_texture(self, texture): texture.blit_buffer(self.cbuffer)
这样,您可以使用相同的方法进行初始化和 重新加载。
注意
对于使用我们的核心文本渲染器进行的所有文本渲染,纹理为 生成,但我们已经绑定了一种方法来重做文本渲染并 将文本重新上传到纹理。您无需执行任何操作。