Pyglet循环批量添加图形仅显示首个问题求助
问题原因与解决方案
你的猜测方向是对的,但更精准的解释是:Pyglet的Batch对象并没有持有对图形对象的强引用。
为什么循环里只显示一个矩形?
在你的循环代码中,每次迭代都会把新创建的Rectangle赋值给同一个rectangle变量——这意味着前一个矩形对象会失去所有强引用,Python的垃圾回收机制会自动销毁这些无引用的对象,连带它们在Batch中的绘制数据也会被移除。最终只有最后一个被赋值的矩形(因GC时机不同可能表现为仅显示一个)能保留下来被绘制。
而你单独命名每个矩形变量时,每个对象都有独立的强引用,不会被垃圾回收,所以Batch能正常绘制所有图形。
解决方法:保留图形对象的强引用
只需要用一个容器(比如列表)来保存所有创建的图形对象,确保它们始终有强引用即可:
import pyglet from pyglet import shapes window = pyglet.window.Window(960, 540) batch = pyglet.graphics.Batch() # 创建一个列表来保存所有图形对象,避免被垃圾回收 kline_shapes = [] for i in range(10): rectangle = shapes.Rectangle(10*i + 10, 100, 5, 100, color=(0,255,0), batch=batch) kline_shapes.append(rectangle) # 将图形加入列表,保留强引用 @window.event def on_draw(): window.clear() batch.draw() pyglet.app.run()
关于Batch的使用说明
完全不用担心Batch无法用于数据可视化(比如你的K线图需求)——只要你把所有需要绘制的K线图形对象都保存在一个容器(列表、字典等)中,确保它们不会被垃圾回收,Batch就能高效地批量绘制所有图形。这种模式在Pyglet中是标准用法,尤其是处理大量图形元素时,Batch的批量绘制能大幅提升性能。
内容的提问来源于stack exchange,提问作者skinnypete
相关产品推荐
相关产品推荐

