You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:38:13