如何获取pyglet中Label的宽度以适配Sprite矩形?
解决Pyglet Label文本宽度获取与Sprite矩形匹配问题
哈哈,这个坑我刚踩过不久!pyglet的Label.width属性确实容易误导人——它只有在你主动给Label指定了固定宽度(比如width=200)的时候才会有值,要是没设置的话,它就返回None,这就是你报错的原因。
要拿到文本实际渲染后的宽度,有两个简单靠谱的方法:
- 用Label自带的
content_width属性:这是pyglet专门用来返回文本内容实际宽度的属性,无需额外计算,直接调用就行。如果是多行文本,它会返回最长一行的宽度。 - 调用
get_text_extent()方法:这个方法会返回一个包含(width, height, x_offset, y_offset)的元组,其中第一个元素就是文本的实际宽度。
下面给你一个完整的示例代码,实现文本和矩形精灵的宽度匹配:
import pyglet # 创建窗口 window = pyglet.window.Window(width=450, height=200) # 创建自适应宽度的Label(不设置width参数) text_content = "Hello Pyglet! This is a test text." text_label = pyglet.text.Label( text_content, font_size=24, x=50, y=100, color=(0, 0, 0, 255) # 黑色文本 ) # 创建1×1像素的白色纹理,作为矩形精灵的图像 pixel_data = b'\xff\xff\xff\xff' # RGBA格式的白色像素 texture = pyglet.image.Texture.create(1, 1) texture.set_data('RGBA', 4, pixel_data) # 创建精灵,初始位置和Label对齐(放在文本下方) rect_sprite = pyglet.sprite.Sprite( texture, x=text_label.x, y=text_label.y - 35 # 往下偏移一点,避免和文本重叠 ) # 获取文本宽度(二选一即可) # 方法1:使用content_width text_width = text_label.content_width # 方法2:使用get_text_extent() # text_width = text_label.get_text_extent()[0] # 设置精灵的宽度匹配文本宽度,同时设置合适的高度 rect_sprite.scale_x = text_width rect_sprite.scale_y = 30 # 自定义矩形高度 rect_sprite.color = (200, 200, 255, 255) # 浅蓝色矩形 @window.event def on_draw(): window.clear() rect_sprite.draw() text_label.draw() pyglet.app.run()
额外注意事项:
- 如果你的Label设置了
anchor_x(比如居中对齐anchor_x='center'),记得调整精灵的x坐标,保证矩形和文本对齐。 - 对于多行文本,
content_width返回的是最长一行的宽度,content_height则是整个文本块的总高度,你可以用它来匹配矩形的高度。
内容的提问来源于stack exchange,提问作者David Callanan
相关产品推荐
相关产品推荐

