如何在矩形内添加文本?

4 阅读2分钟

如何在绿色矩形的内部区域添加一个字符串? GeoFence类用来描述绿色矩形,并且每个矩形都有一个风险等级risk_level

风险等级由字符串数组risks随机产生,字符串数组risks中有“高”、“中”、低”三组元素。

GeoFence类中,文本risk_level使用Arial字体,字体大小为 25。

想要将risk_level显示在矩形内部的正中央位置,但在尝试执行代码后,发现文本未显示。

2、解决方案

方法一:

问题在于,屏幕表面在下一帧被清空后,risk_level文本将消失。

要解决这个问题,需要将文本risk_level绘制在矩形self.image上,而不是在屏幕表面上。

class GeoFence(pygame.sprite.Sprite):

    def __init__(self, rect, risk_level, *groups):
        self._layer = 1
        pygame.sprite.Sprite.__init__(self, groups)
        text_surface = FONT.render(risk_level, True, (255,0,0))
        self.image = pygame.surface.Surface(text_surface.get_size())
        self.image.fill(GREEN)
        self.image.blit(text_surface, (0, 0))
        self.rect = self.image.get_rect(topleft=rect.topleft)
        self.risk_level = risk_level

在这里,文本risk_level被渲染成了一个text_surface,然后用一个大小与text_surface相同的绿色self.image表面填充,最后将text_surface绘制在self.image的左上角。

self.rect被定义为self.image的边界框,而self.risk_level被赋值为风险等级。

方法二:

也可以通过把risk_level文本渲染成一个表面来简化代码。

class GeoFence(pygame.sprite.Sprite):

    def __init__(self, rect, risk_level, *groups):
        self._layer = 1
        pygame.sprite.Sprite.__init__(self, groups)
        self.image = FONT.render(risk_level, True, (255,0,0), GREEN)
        self.rect = self.image.get_rect(topleft=rect.topleft)
        self.risk_level = risk_level

在这里,FONT.render()函数可以同时设置文本的颜色和绿色背景。这样,self.image就成了一个包含risk_level文本的绿色表面,而self.rect则是这个表面边界框。

方法三:

如果希望将文本risk_level居中显示,可以使用另一个text_rect,并将其中心坐标设置为self.rect的中心坐标,最后将文本risk_level绘制在text_rect上。

class GeoFence(pygame.sprite.Sprite):

    def __init__(self, rect, risk_level, *groups):
        self._layer = 1
        pygame.sprite.Sprite.__init__(self, groups)
        text_surface = FONT.render(risk_level, True, (255,0,0))
        self.image = pygame.surface.Surface(
            (text_surface.get_width()+110, text_surface.get_height()+20))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        text_rect = text_surface.get_rect(center=self.rect.center)
        self.image.blit(text_surface, text_rect)
        self.rect.topleft = rect.topleft

在这里,self.rect被创建,但还没有设置坐标,然后text_rect被创建,并将其中心坐标设置为self.rect的中心坐标。

文本risk_level被绘制在text_rect上,最后self.rect被设置到矩形rect的左上角。